使用 sed 从字符串中删除单斜杠而不是双斜杠

Posted

技术标签:

【中文标题】使用 sed 从字符串中删除单斜杠而不是双斜杠【英文标题】:Remove single slash but not double slash from string using sed 【发布时间】:2022-01-11 14:27:31 【问题描述】:

我要编辑的字符串如下所示:

/word1 /word2 //word3

想要的输出:

word1 word2 //word3

以下命令删除所有斜杠,因为它这样做了

str=`echo $str | sed -r 's/\///g'`

如何只删除单个斜杠。

【问题讨论】:

【参考方案1】:

你可以使用

str=$(sed -E 's~(/2,)|/~\1~g' <<< "$str")

见online demo:

#!/bin/bash
s='/word1 /word2 //word3'
sed -E 's~(/2,)|/~\1~g' <<< "$s"
# => word1 word2 //word3

注意-E 选项(如-r 选项)启用POSIX ERE 正则表达式语法。 's~(/2,)|/~\1~g' 匹配并捕获两个或多个连续斜线到组 1 中,否则仅匹配单个斜线,并将匹配项替换为组 1 的内容(因此,在输出中恢复多个斜线,仅删除单个斜线)。

如果你想用空格替换单斜杠,你可以使用下面的 GNU sed:

perl -pe 's~(?<!/)/(?!/)~ ~g' <<< "$s"
## or
sed -E 's~(^|[^/])/($|[^/])~\1\n\2~g;s//\1\n\2/g;s/\n/ /g' <<< "$s"

见this online demo。

perl 命令匹配任何/ 字符,这些字符不是紧接在前面 ((?&lt;!/)) 也不是紧跟在斜线后面 ((?!/))。 sed 命令预处理所有单斜杠((^|[^/])/($|[^/]) 匹配并将字符串开头或非斜杠字符捕获到组 1,然后匹配 /,然后将字符串结尾或非斜杠捕获到组 2) , 并替换为 Group 1 + newline + Group 2 值,即通过将单个斜杠转换为换行符来隔离它们,然后将这些换行符(因为它们从未出现在模式空间中)替换为您需要的任何内容(此处为空格) .

【讨论】:

谢谢它的工作,但我有一个问题,语法的哪一部分完全负责替换单斜杠? /~\1~g' ?另外,如果我想做同样的事情,但不是删除单个斜杠,而是想用空格替换它,评论会是什么样子 @AbdulrahmanTarek 您要求删除单斜杠,而不是替换另一个字符串/字符,因此我的解决方案看起来像这样。使用perl 替换单斜杠,str=$(perl -pe 's~(?&lt;!/)/(?!/)~ ~g' &lt;&lt;&lt; "$str") 也许对两个或多个/ 使用噪音较小的成语//+ @potong 但是,2, 更可定制。

以上是关于使用 sed 从字符串中删除单斜杠而不是双斜杠的主要内容,如果未能解决你的问题,请参考以下文章

shell中单引号双引号反斜杠简说

当下一个字符为“t”时,使用sed命令转义反斜杠

单引号字符串与双引号字符串中的反斜杠

关于js怎样替换反斜杠和单引号的问题

从字符串中删除反斜杠

linux命令学习-引用符号(反斜杠,单引号'',双引号"")