我正在学习在unix中使用sed。 我有一个包含许多行的文件,我想删除除包含字符串的行之外的所有行(例如alex,eva和tom)。 我想我可以用
sed '/alex|eva|tom/!d' filename
但是我发现它不起作用,它无法匹配线路。它只匹配“alex | eva | tom”...... 仅
sed '/alex/!d' filename
作品。
任何人都知道如何使用sed选择包含多于1个单词的行?
加上,括号如“sed'/(alex)|(eva)|(tom)/!d'file”不起作用,我想要包含所有三个单词的行。
答案 0 :(得分:2)
您可以使用:
sed -r '/alex|eva|tom/!d' filename
在Mac上的OR:
sed -E '/alex|eva|tom/!d' filename
使用-i.bak
进行内联编辑,以便:
sed -i.bak -r '/alex|eva|tom/!d' filename
答案 1 :(得分:2)
删除除包含字符串的行以外的所有行(例如alex,eva和tom
)
如你所说,你要求保留包含所有这些单词的行,但你的样本会保留包含任何单词的行。万一“all”不是一个错误的说法:正则表达式不能表达任何顺序搜索,幸运的是sed允许你运行多个匹配:
sed -n '/alex/{/eva/{/tom/p}}'
或者您可以直接删除它们:
sed '/alex/!d; /eva/!d; /tom/!d'
以上适用于GNU /任何系统,使用基于BSD的用户区,您必须插入一堆换行符或将它们作为单独的表达式传递:
sed -n '/alex/ {
/eva/ {
/tom/ p
}
}'
或
sed -e '/alex/!d' -e '/eva/!d' -e '/tom/!d'
答案 2 :(得分:2)
sed是一个很好的工具,可以在一行上进行简单的替换,其他任何东西只需使用awk:
awk '/alex/ && /eva/ && /tom/' file
答案 3 :(得分:1)
您应该使用\|
代替|
。
编辑:对于sed的某些变体而言,这似乎是正确的。
答案 4 :(得分:0)
这可能适合你(GNU sed):
sed -nr '/alex/G;/eva/G;/tom/G;s/\n{3}//p' file
此方法允许存在一系列值,即您希望列表中的2个或更多值使用:
sed -nr '/alex/G;/eva/G;/tom/G;s/\n{2,3}//p' file