sed
(Stream Editor)是一个强大的文本处理工具,它允许你通过脚本对输入流(文件或管道)进行读取、处理并打印。如果你想在sed
中实现“如果不匹配,则返回”的逻辑,你可以使用sed
的条件表达式。
下面是一个基本的示例,说明如何使用sed
在找到匹配项时执行某些操作,在不匹配时返回:
# 假设我们要查找文件中所有的"foo",并替换为"bar",但如果某行不包含"foo",则打印该行
sed '/foo/{s/foo/bar/g;}; s/.*//' input.txt > output.txt
然而,这个命令实际上会打印出所有行的最后一个字符,因为s/.*//
会删除从行首到行尾的所有内容。这不是我们想要的效果。为了在不匹配时返回整行,我们可以使用一个稍微复杂一点的技巧:
# 使用t命令跳转,如果不匹配则打印整行
sed '/foo/{s/foo/bar/g; t; d;}' input.txt > output.txt
在这个命令中:
/foo/
是一个地址范围,表示匹配包含"foo"的行。{...}
是一个命令组,用于对匹配的行执行多个命令。s/foo/bar/g
是替换命令,将所有的"foo"替换为"bar"。t
是跳转命令,它会跳转到脚本中第一个未标记的t
之后的命令。如果没有这样的跳转点,则继续执行后续命令。d
是删除命令,它会删除当前行。因此,这个命令的逻辑是:如果找到"foo",则替换它并跳转(实际上不会跳转,因为没有标记),然后删除该行(这也不会发生,因为t
没有跳转)。如果找不到"foo",则不会执行替换和跳转,直接删除该行(实际上不会删除,因为t
没有跳转,所以d
也不会执行),因此整行会被打印出来。
注意:这个命令实际上不会删除任何行,因为t
没有有效的跳转点,而d
总是在t
之后。这里的d
只是为了防止在找到匹配项时打印该行。
如果你只是想在不匹配时打印整行,而不做任何替换,你可以简化为:
# 如果不匹配"foo",则打印整行
sed -n '/foo/!p' input.txt > output.txt
在这个命令中:
-n
选项告诉sed
不要自动打印模式空间中的行。/foo/!
是一个地址否定,表示不匹配"foo"的行。p
是打印命令,它会打印模式空间中的行。这样,只有不包含"foo"的行会被打印出来。
参考链接:
sed
命令手册页:https://www.gnu.org/software/sed/manual/sed.html请注意,sed
的语法和功能可能因版本和操作系统而异。上面的示例基于GNU sed
,它是Linux和macOS上的常见版本。如果你使用的是其他版本的sed
,可能需要调整命令的语法。
领取专属 10元无门槛券
手把手带您无忧上云