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