命令“sed 's~ ~~g'”中的“~”的目的是什么?

sou*_*ade 30 sed

sed 's~ ~~g'在 Linux 系统上的 shell 脚本中找到了一行。这是什么~

Kus*_*nda 54

它是替代sed( s) 命令的替代分隔符。通常,使用斜杠,如s/pattern/replacement/,但sed允许使用几乎任何字符。

用于使用另一个分隔符比主要原因/sed替换表达式是当表达式将在文字作用/字符。

例如,/some/path/here要用替换路径/other/path/now,可以这样做

s/\/some\/path\/here/\/other\/path\/now/
Run Code Online (Sandbox Code Playgroud)

这患有通常所说的“倾斜牙签综合症”,这意味着它很难阅读和正确维护。

相反,我们可以使用另一个表达式分隔符:

s/\/some\/path\/here/\/other\/path\/now/
Run Code Online (Sandbox Code Playgroud)

使用~只是有效替换表达式分隔符的另一个示例。

你的表情

s~ ~~g
Run Code Online (Sandbox Code Playgroud)

是相同的

s/ //g
Run Code Online (Sandbox Code Playgroud)

并将删除输入中的所有空格。在这种情况下,/根本不需要使用另一个分隔符,因为模式和替换都不包含/.

做同样事情的另一种方式是

tr -d ' ' <infile >outfile
Run Code Online (Sandbox Code Playgroud)


man*_*tor 18

这是一个替换分隔符。最常用的分隔符是正斜杠/。但是sed可以使用任何字符作为分隔符 - 它会自动使用后面的字符s作为分隔符:

sed 's@ @@g'
sed 's+ ++g'
sed 's\ \\g'
sed 's* **g'
Run Code Online (Sandbox Code Playgroud)

也可以使用空格作为分隔符:

echo "foo" | sed 's foo bar g'
Run Code Online (Sandbox Code Playgroud)

/当您的命令中有很多斜杠时,最常使用的其他定界符变得令人困惑。考虑一下我们想要将多个空格转换为一个空格字符的情况:而不是

echo "    a   b  c  " | sed 's/\s\{1,\}/ /g'
Run Code Online (Sandbox Code Playgroud)

你可以跑

echo "    a   b  c  " | sed 's~\s\{1,\}~ ~g'
Run Code Online (Sandbox Code Playgroud)

这更清楚。

  • 反斜杠只在`sed` 的某些实现中起作用,例如GNU `sed`。 (2认同)
  • 这就是 POSIX 所说的,它不是我 :) 让它在某些实现中运行(如 @Kusalananda 提到的)很好,只是您必须意识到并非所有实现都如此 (2认同)
  • 甚至可以使用空格本身作为分隔符,只要它在模式中转义:`sed -e 's \ g'`。(不要复制和粘贴:我不得不使用不间断的空格来防止网站弄乱它。)但是永远不要在代码中编写那些即使在一分钟后仍保持可读的代码。 (2认同)