Mar*_*mbo 3 command-line sed text-processing
我必须在每次出现的 # 之后添加一个空格,只有当 # 位于行首且 # 之后至少有一个不是空格的字符时。例如这段代码:
echo "# ok" | sed "s|^#[^ ]|# |g"
Run Code Online (Sandbox Code Playgroud)
# ok
按预期返回,但此代码:
echo "#ok" | sed "s|^#[^ ]|# |g"
Run Code Online (Sandbox Code Playgroud)
返回# k
并没有# ok
像预期的那样。
我如何获得# ok
输出?
编辑:
这是解决我的问题的代码,感谢@FedonKadifeli:
echo -e "#ok\n# ok\n #ok\n#ok #ok\n##ok #ok"
Run Code Online (Sandbox Code Playgroud)
返回:
#ok
# ok
#ok
#ok #ok
##ok #ok
Run Code Online (Sandbox Code Playgroud)
这段代码:
echo -e "#ok\n# ok\n #ok\n#ok #ok\n##ok #ok" | sed -r 's|^#(#*)([^[:space:]#])|#\1 \2|g'
Run Code Online (Sandbox Code Playgroud)
返回:
# ok
# ok
#ok
# ok #ok
## ok #ok
Run Code Online (Sandbox Code Playgroud)
一种相当直接的方法是仅在以“hash not space”开头的行中将第一个“hash”替换为“hash space”:
$ echo "#ok" | sed "/^#[^ ]/s|#|# |"
# ok
Run Code Online (Sandbox Code Playgroud)
在提供它的正则表达式变体中,如 Perl,您可以使用否定前瞻:
$ echo "#ok" | perl -pe 's/^#(?! )/# /'
# ok
Run Code Online (Sandbox Code Playgroud)