gpt4 book ai didi

linux - sed:用一个下划线替换一系列点

转载 作者:IT王子 更新时间:2023-10-29 01:06:24 25 4
gpt4 key购买 nike

我想用 sed 在 Bash 中做一些简单的字符串替换。我是 Ubuntu 10.10。

只要看下面的代码,它是不言自明的:


name="A%20Google.."
echo $name|sed 's/\%20/_/'|sed 's/\.+/_/'

我想得到 A_Google_ 但我得到 A_Google..

sed 's/\.+/_/' 部分显然是错误的。

顺便说一句,sed 's/\%20/_/'sed 's/%20/_/' 都有效。哪个更好?

最佳答案

sed 使用 POSIX 基本正则表达式,不包括 + 作为元字符。可移植地,重写为使用*:

sed 's/\.\.*/_/'

或者如果您只关心 Linux,您可以使用各种 GNU 主义:

sed -r 's/\.\.*/_/'    # turn on POSIX EREs (use -E instead of -r on OS X)
sed 's/\.\+/_/' # GNU regexes invert behavior when backslash added/removed

最后一个例子回答了您的另一个问题:按原样使用时是字面值的字符在反斜杠时可能具有特殊含义,即使此刻 %反斜杠时没有特殊含义,面向 future 意味着不假设 \% 是安全的。

附加说明:您不需要在管道中使用两个单独的 sed 命令。

echo $name | sed -e 's/\%20/_/' -e 's/\.+/_/'

(此外,您是只需要每行执行一次,还是每次都执行?您可能需要 /g 修饰符。)

关于linux - sed:用一个下划线替换一系列点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6637920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com