我有一个文本文件A.txt
,其中所有行都有由管道|
分隔符分隔的相同数量的字段。我需要将,
替换为|
,以获取每行最后一个分隔符后的数据。
示例:
1,2|3,4|5|6,7,8
1,8|4|6,5,3|4,5
所需的输出,(仅在最后一个分隔符后用,
替换|
):
1,2|3,4|5|6|7|8
1,8|4|6,5,3|4|5
如何使用sed
或awk
?
答案 0 :(得分:3)
使用awk
:
awk 'BEGIN{FS=OFS="|"} gsub(",", "|", $NF)'
BEGIN{FS=OFS="|"}
将输入和输出字段分隔符设置为文字|
gsub(",", "|", $NF)
将所有gsub()
),
替换为最后一个字段中的|
{/ 1}}
示例:强>
$NF
答案 1 :(得分:1)
$ cat ip.txt
1,2|3,4|5|6,7,8
1,8|4|6,5,3|4,5
sed
$ sed -E ':a s/^(.*\|[^,]+),([^|]+)$/\1|\2/g; ta' ip.txt
1,2|3,4|5|6|7|8
1,8|4|6,5,3|4|5
:a
和ta
循环sed
命令,直到找到匹配项^(.*\|[^,]+)
从行首到|
后跟非,
个字符。 *
和+
将尝试尽可能匹配,
匹配逗号([^|]+)$
,在行尾之前不应该有任何|
个字符
与perl
$ perl -F'\|' -lane '$F[-1] =~ tr/,/|/; print join "|",@F' ip.txt
1,2|3,4|5|6|7|8
1,8|4|6,5,3|4|5
-F'\|'
在|
上拆分输入行并保存到@F
数组$F[-1] =~ tr/,/|/;
代表数组的最后一个元素,将所有,
替换为|
print join "|",@F
打印修改后的@F
数组,其中|
为分隔符对于一些正则表达式的魔法:
$ perl -pe 's/.*\|(*SKIP)(*F)|,/|/g' ip.txt
1,2|3,4|5|6|7|8
1,8|4|6,5,3|4|5
.*\|(*SKIP)(*F)
跳过该模式,直至上一个|
,
替换为|