【问题标题】:How do I escape slashes and double and single quotes in sed?如何在 sed 中转义斜杠和双引号和单引号?
【发布时间】:2011-11-22 23:25:31
【问题描述】:

据我所知,当你使用单引号时,里面的所有内容都被认为是文字。我想要那个来代替我。但我也想找到一个有单引号或双引号的字符串。

例如,

sed -i 's/"http://www.fubar.com"/URL_FUBAR/g'

我想用 URL_FUBAR 替换“http://www.fubar.com”。 sed 应该如何识别我的 // 或我的双引号?

感谢您的帮助!

编辑:我可以使用s/\"http\:\/\/www\.fubar\.\com\"/URL_FUBAR/g 吗?

\ 是否真的在单引号内转义字符?

【问题讨论】:

    标签: bash sed


    【解决方案1】:

    可能是“\”字符,试试这个:

    sed 's/\"http:\/\/www.fubar.com\"/URL_FUBAR/g'
    

    【讨论】:

    • 提出疯狂的猜测不是解决方案。你可以在 cmets 中添加这样的猜测——甚至更好——先尝试一下
    【解决方案2】:

    需要使用\"转义"字符(\转义后面的字符

    sed -i 's/\"http://www.fubar.com\"/URL_FUBAR/g'
    

    【讨论】:

      【解决方案3】:

      sed 中的s/// 命令允许您使用其他字符而不是/ 作为分隔符,如

      sed 's#"http://www\.fubar\.com"#URL_FUBAR#g'
      

      sed 's,"http://www\.fubar\.com",URL_FUBAR,g'
      

      双引号不是问题。要匹配单引号,请切换两种类型的引号。请注意,单引号字符串可能不包含单引号(甚至不包含转义的引号)。

      如果sed 要将它们解释为文字点而不是正则表达式模式. 匹配任何一个字符,则需要对这些点进行转义。

      【讨论】:

      • 很好的答案,我只是有一个简单的问题。我将如何用单引号代替双引号。我的代码中有单引号或双引号的实例,我可以运行此命令两次,但是转义单引号的语法是什么?
      • 转义单引号对我不起作用(mac上的bash),但是使用不同的引号类型来包装命令而不是被替换的引号确实有效。例如:sed 's/"/bla/g'" 替换为 blased "s/'/bla/g" to replace '` 替换为 bla
      • @rrr 单引号字符串不能包含嵌入的单引号。更改外引号(并转义 shell 现在可能有兴趣解释的任何特殊字符)是解决此问题的一种方法。另一种方法是跳出单引号字符串并将字符串与"'"(双引号单引号)连接,然后继续使用单引号字符串的其余部分,如'you'"'"'d better do that'
      【解决方案4】:

      单引号内的单引号很难转义。试试这个:

      sed "s@['\"]http://www.\([^.]\+).com['\"]@URL_\U\1@g" 
      

      例子:

      $ sed "s@['\"]http://www.\([^.]\+\).com['\"]@URL_\U\1@g" <<END
      this is "http://www.fubar.com" and 'http://www.example.com' here
      END
      

      生产

      this is URL_FUBAR and URL_EXAMPLE here
      

      【讨论】:

        【解决方案5】:

        我的问题是我需要在表达式之外有"",因为我在 sed 表达式本身中有一个动态变量。因此,实际解决方案是来自 lenn jackman 的解决方案,您将 sed 正则表达式中的 " 替换为 [\"]

        所以我完整的 bash 是:

        RELEASE_VERSION="0.6.6"
        
        sed -i -e "s#value=[\"]trunk[\"]#value=\"tags/$RELEASE_VERSION\"#g" myfile.xml
        

        这里是:

        # 是 sed 分隔符

        [\"] = " 在正则表达式中

        value = \"tags/$RELEASE_VERSION\" = 我的替换字符串,重要的是它只有 \" 的引号

        【讨论】:

          【解决方案6】:

          关于单引号,请参见下面的代码,用于将字符串let's 替换为let us

          命令:

          echo "hello, let's go"|sed 's/let'"'"'s/let us/g'
          

          结果:

          你好,我们走吧

          【讨论】:

          • 有一个 much 更简单的方法来做到这一点。试试:echo "hello, let's go" | sed s/let\'s/let us/g。您实际上必须在单引号中包含sed 的参数。
          【解决方案7】:

          在 sed 中转义双引号是绝对必要的:例如,如果您在整个 sed 表达式中使用双引号(当您想使用 shell 变量时需要这样做)。

          这是一个涉及 sed 中转义但也捕获 bash 中的其他一些引用问题的示例:

          # cat inventory
          PURCHASED="2014-09-01"
          SITE="Atlanta"
          LOCATION="Room 154"
          

          假设您想使用可以反复使用的 sed 脚本来更改房间,因此您可以按如下方式改变输入:

          # i="Room 101" (these quotes are there so the variable can contains spaces)
          

          如果不存在,此脚本将添加整行,或者它会简单地用文本加上 $i 的值替换(使用 sed)存在的行。

          if grep -q LOCATION inventory; then 
          ## The sed expression is double quoted to allow for variable expansion; 
          ## the literal quotes are both escaped with \ 
              sed -i "/^LOCATION/c\LOCATION=\"$i\"" inventory
          ## Note the three layers of quotes to get echo to expand the variable
          ## AND insert the literal quotes
          else 
              echo LOCATION='"'$i'"' >> inventory
          fi
          

          附:我在多行上编写了上面的脚本以使 cmets 可解析,但我将它用作命令行上的单行代码,如下所示:

          i="your location"; if grep -q LOCATION inventory; then sed -i "/^LOCATION/c\LOCATION=\"$i\"" inventory; else echo LOCATION='"'$i'"' >> inventory; fi
          

          【讨论】:

            【解决方案8】:
            Prompt% cat t1
            This is "Unix"
            This is "Unix sed"
            Prompt% sed -i 's/\"Unix\"/\"Linux\"/g' t1
            Prompt% sed -i 's/\"Unix sed\"/\"Linux SED\"/g' t1
            Prompt% cat t1
            This is "Linux"
            This is "Linux SED"
            Prompt%
            

            【讨论】:

            • 只需在 "(双引号).. 之前使用 (反斜杠).. 并使用 -i 选项
            • 虽然欢迎使用此代码 sn-p,并且可能会提供一些帮助,但它会是 greatly improved if it included an explanation of 如何解决这个问题。没有这个,你的回答就没有多少教育价值了——记住你是在为未来的读者回答这个问题,而不仅仅是现在提问的人!请edit您的答案添加解释,并说明适用的限制和假设。
            【解决方案9】:

            另外:包含 BASH 变量的 sed 表达式需要双引号 (") 才能正确解释变量。

            如果你双引号你的 $BASH 变量(推荐做法)

            ...然后你可以转义变量双引号,如图:

            sed -i "s/foo/bar ""$VARIABLE""/g" <file>
            

            即,将与 $VARIABLE 关联的 " 替换为 ""

            (简单地将"$VAR" 转义为\"$VAR\" 会产生" 引用的输出字符串。)


            示例

            $ VAR='apples and bananas'
            $ echo $VAR
            apples and bananas
            
            $ echo "$VAR"
            apples and bananas
            
            $ printf 'I like %s!\n' $VAR
            I like apples!
            I like and!
            I like bananas!
            
            $ printf 'I like %s!\n' "$VAR"
            I like apples and bananas!
            

            这里,$VAR 在管道到 sed 之前是 "-引用(sed 是 '- 或 "-引用):

            $ printf 'I like %s!\n' "$VAR" | sed 's/$VAR/cherries/g'
            I like apples and bananas!
            
            $ printf 'I like %s!\n' "$VAR" | sed 's/"$VAR"/cherries/g'
            I like apples and bananas!
            
            $ printf 'I like %s!\n' "$VAR" | sed 's/$VAR/cherries/g'
            I like apples and bananas!
            
            $ printf 'I like %s!\n' "$VAR" | sed 's/""$VAR""/cherries/g'
            I like apples and bananas!
            
            $ printf 'I like %s!\n' "$VAR" | sed "s/$VAR/cherries/g"
            I like cherries!
            
            $ printf 'I like %s!\n' "$VAR" | sed "s/""$VAR""/cherries/g"
            I like cherries!
            

            比较一下:

            $ printf 'I like %s!\n' $VAR | sed "s/$VAR/cherries/g"
            I like apples!
            I like and!
            I like bananas!
            
            
            $ printf 'I like %s!\n' $VAR | sed "s/""$VAR""/cherries/g"
            I like apples!
            I like and!
            I like bananas!
            

            ...等等...

            结论

            作为标准做法,我的建议是

            • "-quote BASH 变量 ("$VAR")
            • "-quote,再次,如果在 sed 表达式中使用这些变量 (""$VAR"")(它本身必须是 "-quote,而不是 '-quoted)李>
            $ VAR='apples and bananas'
            
            $ echo "$VAR"
            apples and bananas
            
            $ printf 'I like %s!\n' "$VAR" | sed "s/""$VAR""/cherries/g"
            I like cherries!
            
            

            【讨论】:

              【解决方案10】:

              你可以使用 %

              sed -i "s%http://www.fubar.com%URL_FUBAR%g"
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2022-01-27
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-11-06
                相关资源
                最近更新 更多