我sed 's~ ~~g'
在 Linux 系统上的 shell 脚本中找到了一行。这是什么~
?
答案1
sed
它是替代 ( ) 命令的替代分隔符s
。通常,使用斜杠,如 中s/pattern/replacement/
,但sed
允许使用几乎任何字符。
/
在替换表达式中使用另一个分隔符的主要原因sed
是表达式将作用于文字/
字符。
例如,要将路径替换/some/path/here
为/other/path/now
,可以这样做
s/\/some\/path\/here/\/other\/path\/now/
这会受到通常所说的问题的影响“倾斜牙签综合症”,这意味着它很难阅读和正确维护。
相反,我们可以使用另一个表达式分隔符:
s#/some/path/here#/other/path/now#
使用~
只是有效替换表达式分隔符的另一个示例。
你的表情
s~ ~~g
是相同的
s/ //g
并将删除输入中的所有空格。在这种情况下,/
根本不需要使用另一个分隔符,因为模式和替换都不包含/
。
做同样事情的另一种方法是
tr -d ' ' <infile >outfile
答案2
这是一个替换分隔符。最常用的分隔符是正斜杠/
。但sed
可以使用任何字符作为分隔符 - 它将自动使用 后面的字符s
作为分隔符:
sed 's@ @@g'
sed 's+ ++g'
sed 's\ \\g'
sed 's* **g'
也可以使用空格作为分隔符:
echo "foo" | sed 's foo bar g'
/
当语法中的命令中有很多斜杠时,最常使用的其他分隔符会变得令人困惑。考虑这种情况,我们想要将多个空格转换为一个空格字符:而不是
echo " a b c " | sed 's/\s\{1,\}/ /g'
你可以跑
echo " a b c " | sed 's~\s\{1,\}~ ~g'
这更清楚。