我有一个这样的以竖线分隔的文本文件
TEST|F123433|F123433|TEST
TEST|F123434|F123434|TEST
TEST|F123435|F123435|TEST
TEST|F123436|F123436|TEST
TEST|F123437|F123437|TEST
我正在尝试从第2列和第3列中删除前导'F'。这是预期的输出。
TEST|123433|123433|TEST
TEST|123434|123434|TEST
TEST|123435|123435|TEST
TEST|123436|123436|TEST
TEST|123437|123437|TEST
我尝试使用sed如下操作,但它仅从第2列而不是第3列中删除“ F”
sed 's/^TEST|F/TEST|/g'
答案 0 :(得分:4)
使用sed
(仅适用于上述示例),您可以将|F
全局替换为|
:
$ sed -E 's/\|F/\|/g' file
您可以将|F
的前两个实例(不一定是列号)限制为sed
的两个非全局替换:
sed -e 's/\|F/\|/' -e 's/\|F/\|/' file
或采用ERE形式:
$ sed -E 's/^([^|]*)\|F/\1|/; s/([^|]*)\|F/\1|/' file
使用awk
的更好,更灵活的逐字段解决方案可让您指定哪一列:
$ awk 'BEGIN{FS=OFS="|"} {for (i=2; i<=3;i++)sub(/^F/,"",$i);}1' file
TEST|123433|123433|TEST
TEST|123434|123434|TEST
TEST|123435|123435|TEST
TEST|123436|123436|TEST
TEST|123437|123437|TEST
答案 1 :(得分:1)
您需要使用捕获组来复制F
之后第二列中的所有内容。
sed 's/^TEST|F\([^|]*\)|F/TEST|\1|/'
不需要使用g
修饰符,因为每行只进行一次替换(并且以^
或$
锚定的模式始终只能匹配一次)。 / p>
答案 2 :(得分:1)
也可以尝试简单的awk
吗?将其sub
函数用于第二和第三字段。
awk 'BEGIN{FS=OFS="|"} {sub(/^F/,"",$2);sub(/^F/,"",$3)} 1' Input_file
TEST|123433|123433|TEST
TEST|123434|123434|TEST
TEST|123435|123435|TEST
TEST|123436|123436|TEST
TEST|123437|123437|TEST
答案 3 :(得分:1)
通过sed
,使用捕获组:
sed -E -n 's/^(TEST\|)F(.*)F(.*)/\1\2\3/p'
输出:
TEST|123433|123433|TEST
TEST|123434|123434|TEST
TEST|123435|123435|TEST
TEST|123436|123436|TEST
TEST|123437|123437|TEST
答案 4 :(得分:1)
这可能对您有用(GNU sed):
sed -r 's/(F|([^F|]?))([^|]*)/\2\3/2;s/(F|([^F|]?))([^|]*)/\2\3/3' file
这将删除第二列和第三列中以F
分隔的列的第一个字符|
。它利用了一个不匹配的反向引用为空的事实,因此在RHS中使用这种引用进行替换将有效地删除先前的匹配。
答案 5 :(得分:0)
awk '{gsub(/\|F/,"|")}1' file
TEST|123433|123433|TEST
TEST|123434|123434|TEST
TEST|123435|123435|TEST
TEST|123436|123436|TEST
TEST|123437|123437|TEST
答案 6 :(得分:0)
使用Perl
$ cat > bala.txt
TEST|F123433|F123433|TEST
TEST|F123434|F123434|TEST
TEST|F123435|F123435|TEST
TEST|F123436|F123436|TEST
TEST|F123437|F123437|TEST
$ perl -F"[|]" -lane ' s/^.// for @F[1..2] ; print join("|",@F) ' bala.txt
TEST|123433|123433|TEST
TEST|123434|123434|TEST
TEST|123435|123435|TEST
TEST|123436|123436|TEST
TEST|123437|123437|TEST