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

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)

ste*_*ver 6

一种相当直接的方法是仅在以“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)


Fed*_*eli 5

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

sed -r 's/^#([^ ])/# \1/'
Run Code Online (Sandbox Code Playgroud)