我有具有以下结构的文件:
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 s
ubstitute 命令仅对第二个匹配项(即第二个字段)进行替换。
使用 GNU 或 BSD sed,您可以将语法简化为:
sed -E 's/[^|]([^|]*|)/\1/2' <file
答案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
;前导零消失。