删除奇数行中出现的特定字符之后的所有文本

删除奇数行中出现的特定字符之后的所有文本

删除所有奇数行中出现的特定字符之后的所有文本

这适用于 sed 文件中的每一行

sed 's/;.*//' 

如何编辑此 sed 行,使其只处理所有奇数行

答案1

使用 GNU sed

$ sed '1~2s/;.*//' file

地址范围1~2将匹配第 1 行,然后是之后的每隔一行。一般情况是first~step,手册中的示例sed -n 1~2p将打印所有奇数行。

这是一个 GNU 扩展。

中的等效内容awk

$ awk 'NR % 2 { sub(";.*", "") } { print }' file

或者,正如箭头在评论中所建议的:

$ awk -F';' 'NR % 2 { $0 = $1 } { print }' file

具有相同的效果,但不是显式替换第一个之后的所有内容,而是用作字段分隔符(使用;),然后仅输出第一个字段(通过仅将整个输入行替换为奇数行的第一个字段)。;-F';'

答案2

这可能适用于所有sed版本,GNU sed但经过测试

$ cat ip.txt 
foo;bar-baz;xyz
a;b;c
good bad. hi there
d;e
cool;hot;normal

$ sed 's/;.*//;n' ip.txt 
foo
a;b;c
good bad. hi there
d;e
cool

n命令将获取下一行,但不会更改任何内容,实际上只允许更改奇数行


perl

perl -pe 's/;.*// if $.%2' ip.txt

whereif $.%2添加条件仅当行号为奇数时才执行替换

相关内容