使用 sed 或类似工具将空字符串替换为文本

使用 sed 或类似工具将空字符串替换为文本

是否可以更换一个空字符串使用一些文本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

如果您想检测空输入并注入字符串,那么您可以使用ifnemoreutils 包及其-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

或者,用ifthen代替短路逻辑,

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'

相关内容