如何使用 sed 删除特定列中的第一个字符

如何使用 sed 删除特定列中的第一个字符

我有具有以下结构的文件:

999963803|081439403|FFF|33
999964211|081823904|FFF|33
999970948|081765738|FFF|33
999971835|081736346|FFF|33
999972780|082127527|FFF|33

我需要删除第二列中的第一个字符,我尝试使用sed "s/|.1|/^.\(.*\)/\1/" my_file.txt,但不起作用,结果必须是:

999963803|81439403|FFF|33
999964211|81823904|FFF|33
999970948|81765738|FFF|33
999971835|81736346|FFF|33
999972780|82127527|FFF|33

答案1

使用 awk:

 awk -F"|" '{print $1"|"substr($2,2)"|"$3"|"$4}' <test

答案2

使用 POSIX sed:

sed -e 's/[^|]\([^|]*|\)/\1/2' <file

正则表达式[^|][^|]*|表示除 之外的一个或多个字符序列|,因此它将匹配每个字段,除了最后一个字段,您需要[^|][^|]*$匹配最后一个字段。2修饰符 made substitute 命令仅对第二个匹配项(即第二个字段)进行替换。

使用 GNU 或 BSD sed,您可以将语法简化为:

sed -E 's/[^|]([^|]*|)/\1/2' <file

sed -E 将成为下一个 POSIX 版本的标准

答案3

为什么这么复杂?

这是第一个字符之后的第一个字符,|所以
sed <filename -e 's/|./|/'
……应该可以工作。

也就是说,找到第一个|并包含其后的字符,替换为 just |

例如:

$ sed <my_file.txt -e 's/|./|/'
999963803|81439403|FFF|33
999964211|81823904|FFF|33
999970948|81765738|FFF|33
999971835|81736346|FFF|33
999972780|82127527|FFF|33

注意:/g在末尾添加以使其替换所有出现的位置,而不仅仅是第一个。

答案4

这个简单awk

awk -F"|" '{OFS="|"}$2=$2*1' file

OFS定义输出字段分隔符。$2=$2*1只需将第二个字段乘以1;前导零消失。

相关内容