我想创建一个sed命令,在文件中查找匹配模式的第一行,删除所有该行或将其全部替换为其他文本.我不想匹配所有的行,因为规则是匹配它的一部分.
我怎么能用sed做到这一点?
例如:
myline 1 is pretty
line 2 is ugly
myline 111 is nice
我想删除包含“1 is”的第一行
更新:我的行可能包含“/”和“
问候
FAK
解决方法:
我倾向于使用awk来处理更复杂的任务,它比sed更强大,具有适当的循环和选择结构(为了可读性而扩展,如果你愿意,你可以将它压缩回一行):
pax$echo '
xyz
myline 1 is pretty
line 2 is ugly
myline 111 is nice' | awk '
/1 is/ {if (f) {print} else {f = 1}}
!/1 is/ {print}'
xyz
line 2 is ugly
myline 111 is nice
对于任何不匹配模式的行(!/ 1是/),它只是打印它.
对于与模式匹配的行,如果设置了标志f(它最初未设置),则将它们全部打印出来.当标志未设置且遇到匹配的行时,它会设置标志并不打印它.这基本上根据需要删除第一个匹配行.
如果你想修改第一个匹配的行而不是删除它,你只需在f = 1旁边插入代码即可,例如:
pax$echo '
xyz
myline 1 is pretty
line 2 is ugly
myline 111 is nice' | awk '
/1 is/ {if (f) {print} else {f = 1;print "URK!!!"}}
!/1 is/ {print}'
xyz
URK!!!
line 2 is ugly
myline 111 is nice
要在awk中使用shell变量,可以使用-v选项将其作为真正的awk变量传递:
pax$export xyzvar=URK ; echo '
xyz
myline 1 is pretty
line 2 is ugly
myline 111 is nice' | awk -vmyvar=$xyzvar '
/1 is/ {if (f) {print} else {f = 1;print myvar}}
!/1 is/ {print}'
xyz
URK
line 2 is ugly
myline 111 is nice
标签:linux,sed,full-text-search
来源: https://codeday.me/bug/20190726/1542525.html