如何从管道定界文件中的特定列中删除前导字符?

时间:2018-12-20 22:53:36

标签: regex awk sed

我有一个这样的以竖线分隔的文本文件

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'

7 个答案:

答案 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