删除所有奇数行中出现的特定字符之后的所有文本
这适用于 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
添加条件仅当行号为奇数时才执行替换