“sed” 仅在特定条件下添加空格

“sed” 仅在特定条件下添加空格

我必须在每个出现的 # 后面添加一个空格,前提是 # 位于行首,并且 # 后面至少有一个不是空格的字符。例如以下代码:

echo "# ok" | sed "s|^#[^ ]|# |g"

# ok按预期返回,但是此代码:

echo "#ok" | sed "s|^#[^ ]|# |g"

返回结果# k# ok预期不符。
如何获取# ok输出?

编辑:

这是解决我的问题的代码,感谢@FedonKadifeli:

echo -e "#ok\n# ok\n #ok\n#ok #ok\n##ok #ok"

返回:

#ok
# ok
 #ok
#ok #ok
##ok #ok

此代码:

echo -e "#ok\n# ok\n #ok\n#ok #ok\n##ok #ok" | sed -r 's|^#(#*)([^[:space:]#])|#\1 \2|g'

返回:

# ok
# ok
 #ok
# ok #ok
## ok #ok

答案1

一种相当直接的方法是仅在以“hash not space”开头的行中用“hash space”替换第一个“hash”:

$ echo "#ok" | sed "/^#[^ ]/s|#|# |"
# ok

在提供此功能的正则表达式变体中,例如 Perl,你可以使用负面前瞻

$ echo "#ok" | perl -pe 's/^#(?! )/# /'
# ok

答案2

您可以使用sed反向引用“ 像这样:

sed -r 's/^#([^ ])/# \1/'

答案3

这是解决我的问题的代码,感谢@steeldriver 和@FedonKadifeli:

echo -e "#ok\n#ok\n# ok\n# ok\n#ok\nnobegin #ok"

返回:

#ok
#ok
# ok
# ok
#ok
nobegin #ok

此代码:

echo -e "#ok\n#ok\n# ok\n# ok\n#ok\nnobegin #ok" | sed "\|^#[^[:space:]]|s|#|# |g"

或者这个更合逻辑的代码:

echo -e "#ok\n#ok\n# ok\n# ok\n#ok\nnobegin #ok" | sed -r "s|^#([^[:space:]])|# \1|g"

返回:

# ok
# ok
# ok
# ok
# ok
nobegin #ok

相关内容