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