是否可以使用或类似工具用一些文本替换空字符串?sed
sed 's/^$/sometext/'
将匹配一个空行,但这不是我要找的。我认为
sed 's//sometext/'
会起作用,但事实似乎并非如此。
在这种特殊情况下,我希望检测到grep
没有匹配项。
echo 'hi' | grep 'sam' | ...
是否可以使用或类似工具用一些文本替换空字符串?sed
sed 's/^$/sometext/'
将匹配一个空行,但这不是我要找的。我认为
sed 's//sometext/'
会起作用,但事实似乎并非如此。
在这种特殊情况下,我希望检测到grep
没有匹配项。
echo 'hi' | grep 'sam' | ...
要替换空行,您需要
sed
输入空行。空行本身就是换行符。这可以由
echo
或产生printf '\n'
。请注意,这将替换输入中的所有空行,无论其他行是否非空。
如果你想检测空输入并注入一个字符串,那么你可以使用
ifne
moreutils 包中的-n
选项:在这里,只有在其标准输入流上未检测到任何输入时
echo sometext
才会执行。ifne
如果管道的左侧确实产生数据,则该数据将被输出。至于你关于检测不匹配的额外信息
grep
:或者,用
if
并then
代替短路逻辑,这
grep
与它的-q
选项一起使用,这会导致实用程序相当,而只会使用其退出状态表示匹配成功或不成功。如果不匹配,它将以非零退出状态退出,上面的代码检测到这一点并执行echo no match
。两者都不匹配
printf ''
的和 a将以零字节的总数输出。grep
这与一个 NUL (\0
) 字节不同,如果没有字节,则没有任何内容可以替换。我们不能使用匹配零长度字符串的正则表达式,因为它们通常会匹配每个字符,例如
printf 'foo\n' | sed -E 's/.{0}/X/g'
printXfXoXoX
。(也sed -e 's//.../'
根本不起作用,因为在 sed 中,空正则表达式意味着重用前一个。)我们必须以其他方式检测空输入。
下面的 AWK 脚本会将所有输入行复制到输出,如果没有,则打印
new text
:(
NR
包含输入中“记录”的数量,在实践行中。如果缺少它,这会将尾随换行符添加到最后一行。)正如@Kamil Maciorowski 在评论中指出的那样,在特定情况下
grep
,可以解析它的退出代码而不是stdout:这也将允许处理任何发生的匹配:
如果您希望禁止匹配,请使用
grep
的-q
选项: