使用 sed 从字符串中删除单斜杠而不是双斜杠
Remove single slash but not double slash from string using sed
我要编辑的字符串如下所示:
/word1 /word2 //word3
想要的输出:
word1 word2 //word3
以下命令删除所有斜杠,因为它这样做了
str=`echo $str | sed -r 's/\///g'`
如何只删除单斜杠。
你可以使用
str=$(sed -E 's~(/{2,})|/~~g' <<< "$str")
#!/bin/bash
s='/word1 /word2 //word3'
sed -E 's~(/{2,})|/~~g' <<< "$s"
# => word1 word2 //word3
请注意 -E
选项(作为 -r
选项)启用 POSIX ERE 正则表达式语法。 's~(/{2,})|/~~g'
将两个或多个连续斜杠匹配并捕获到第 1 组中,否则仅匹配一个斜杠,并将匹配项替换为第 1 组的内容(因此,在输出中恢复多个斜杠,仅删除单个斜杠)。
如果你想用space替换单斜杠,你可以使用下面的GNU sed
:
perl -pe 's~(?<!/)/(?!/)~ ~g' <<< "$s"
## or
sed -E 's~(^|[^/])/($|[^/])~\n~g;s//\n/g;s/\n/ /g' <<< "$s"
参见 this online demo。
perl
命令匹配前面没有紧接 ((?<!/)
) 也没有紧跟斜杠 ((?!/)
) 的任何 /
个字符。 sed
命令预处理所有单斜杠((^|[^/])/($|[^/])
匹配并将字符串或非斜杠字符的开头捕获到组 1 中,然后匹配 /
然后捕获字符串结尾或非斜杠字符-slash into Group 2),并替换为 Group 1 + newline + Group 2 values,即通过将单斜杠转换为换行符来隔离它们,然后替换这些换行符(因为它们从未出现在模式 space 中)随心所欲(这里是 space)。
我要编辑的字符串如下所示:
/word1 /word2 //word3
想要的输出:
word1 word2 //word3
以下命令删除所有斜杠,因为它这样做了
str=`echo $str | sed -r 's/\///g'`
如何只删除单斜杠。
你可以使用
str=$(sed -E 's~(/{2,})|/~~g' <<< "$str")
#!/bin/bash
s='/word1 /word2 //word3'
sed -E 's~(/{2,})|/~~g' <<< "$s"
# => word1 word2 //word3
请注意 -E
选项(作为 -r
选项)启用 POSIX ERE 正则表达式语法。 's~(/{2,})|/~~g'
将两个或多个连续斜杠匹配并捕获到第 1 组中,否则仅匹配一个斜杠,并将匹配项替换为第 1 组的内容(因此,在输出中恢复多个斜杠,仅删除单个斜杠)。
如果你想用space替换单斜杠,你可以使用下面的GNU sed
:
perl -pe 's~(?<!/)/(?!/)~ ~g' <<< "$s"
## or
sed -E 's~(^|[^/])/($|[^/])~\n~g;s//\n/g;s/\n/ /g' <<< "$s"
参见 this online demo。
perl
命令匹配前面没有紧接 ((?<!/)
) 也没有紧跟斜杠 ((?!/)
) 的任何 /
个字符。 sed
命令预处理所有单斜杠((^|[^/])/($|[^/])
匹配并将字符串或非斜杠字符的开头捕获到组 1 中,然后匹配 /
然后捕获字符串结尾或非斜杠字符-slash into Group 2),并替换为 Group 1 + newline + Group 2 values,即通过将单斜杠转换为换行符来隔离它们,然后替换这些换行符(因为它们从未出现在模式 space 中)随心所欲(这里是 space)。