【问题标题】:How to escape single quote in sed?如何在sed中转义单引号?
【发布时间】:2014-07-01 11:31:39
【问题描述】:

如何在 sed 表达式中转义已经被引号包围的单引号?

例如:

sed 's/ones/one's/' <<< 'ones thing'

【问题讨论】:

标签: sed escaping quote


【解决方案1】:

用双引号引用sed代码:

    $ sed "s/ones/one's/"<<<"ones thing"   
    one's thing

我不喜欢用数百个反斜杠转义代码 - 伤害我的眼睛。通常我是这样做的:

    $ sed 's/ones/one\x27s/'<<<"ones thing"
    one's thing

【讨论】:

  • 这似乎不适用于sed -i,有什么特别的原因吗?
  • 需要注意的是,用双引号括起来的 sed 命令允许这些命令被 shell 插值,并可能导致无法预料的问题。
  • 这导致了我正在寻找的答案最终是:echo "one's thing" | sed 's/\x27/\\'"'"'/g' >> $ one\'s thing
  • 这是否适用于sed -i 是一个红鲱鱼。并非所有sed 方言都接受像\x27 这样的十六进制代码,无论您是否传入-i 标志。
  • @matttrach 更简单:echo "one's thing" | sed 's/\x27/\\&amp;/g'
【解决方案2】:

一个技巧是使用 shell 字符串连接相邻字符串并使用 shell 转义来转义嵌入的引号:

sed 's/ones/two'\''s/' &lt;&lt;&lt; 'ones thing'

two's thing

sed 表达式中有 3 个字符串,然后 shell 将它们拼接在一起:

sed 's/ones/two'

\'

's/'

希望对其他人有所帮助!

【讨论】:

  • 也许是一个更简单的变体:sed 's/ones/two''s/'
  • @gregory: sed 's/ones/two''s/' &lt;&lt;&lt; 'ones thing' 不,输出twos thing。它在输出中缺少'。您必须按照此答案中描述的方式进行操作。
  • @wisbucky 使用我在 zsh 上使用的 sed 版本(FreeBSD/macOS),它肯定会输出“two's thing”。
  • 帮我大忙,告诉我,壳然后缝合在一起。
【解决方案3】:

中转义单引号:3 种不同的方式:

从脆弱到坚固...

1。使用双引号括起来 sed 脚本

最简单的方法:

sed "s/ones/one's/" <<< 'ones thing'

但是使用双引号会导致 shell 变量扩展和反斜杠被视为 shell 转义之前运行sed

1.1。没有空格和特殊字符的特定情况

在这种特定情况下,您可以避免在 shell 级别(命令行)封闭:

sed s/ones/one\'s/ <<<'ones thing'

直到整个 sedscript 不包含空格、分号、特殊字符等...(脆弱!)

2。使用八进制十六进制表示:

这种方式简单高效,虽然不如下一种可读性强。

sed 's/ones/one\o047s/' <<< 'ones thing'

sed 's/ones/one\x27s/' <<< 'ones thing'

由于后面的字符 (s) 不是数字,你可以只写 2 个数字的八进制:

sed 's/ones/one\o47s/' <<< 'ones thing'

3。创建一个专用的 sed 脚本

首先确保 sed 工具的路径正确:

which sed
/bin/sed

然后将shebang改成如下:

cat <<"eosedscript" >sampleSedWithQuotes.sed
#!/bin/sed -f

s/ones/one's/;
eosedscript
chmod +x sampleSedWithQuotes.sed

从那里,您可以运行:

./sampleSedWithQuotes.sed <<<'ones thing'
one's thing

这是最强大和最简单的解决方案,因为您的脚本最易读
$ cat sampleSedWithQuotes.sed

#!/bin/sed -f

s/ones/one's/;

3.1 你可以使用-ised 标志:

由于这个脚本在shebang中使用sed,你可以在命令行上使用sed标志。对于编辑file.txt 就地,使用-i 标志:

echo >file.txt 'ones thing'
./sampleSedWithQuotes.sed -i file.txt
cat file.txt
one's thing

【讨论】:

    【解决方案4】:

    只需在 sed 命令的外部使用双引号即可。

    $ sed "s/ones/one's/" <<< 'ones thing'
    one's thing
    

    它也适用于文件。

    $ echo 'ones thing' > testfile
    $ sed -i "s/ones/one's/" testfile
    $ cat testfile
    one's thing
    

    如果字符串中有单个 双引号,也可以。只需转义双引号即可。

    例如,此文件包含一个带有单引号和双引号的字符串。我将使用 sed 添加单引号并删除一些双引号。

    $ cat testfile
    "it's more than ones thing"
    $ sed -i "s/\"it's more than ones thing\"/it's more than one's thing/" testfile 
    $ cat testfile 
    it's more than one's thing
    

    【讨论】:

    • 谢谢!我爱正则表达式,爱 sed,现在我爱你
    • 这基本上复制了 2014 年接受的答案。
    【解决方案5】:

    最好的方法是使用$'some string with \' quotes \''

    例如:

    sed $'s/ones/two\'s/' <<< 'ones thing'
    

    【讨论】:

    • C 风格的$'string' 是特定于 Bash 的,因此它不能移植到 POSIX shell。
    • 这不是bash 特定的。它也可以在kshzsh 中使用,但是是的,它是 POSIX 的扩展,如果您不编写可移植脚本,这很好。唯一的缺点是您还必须转义您使用的任何其他反斜杠。
    【解决方案6】:

    这有点荒谬,但我无法让sed 's/ones/one\'s/' 中的\' 工作。我正在查找这个以制作一个 shell 脚本,该脚本将使用 Angular 自动将 import 'hammerjs'; 添加到我的 src/main.ts 文件中。

    我的工作是这样的:

    apost=\'
    sed -i '' '/environments/a\
    import '$apost'hammerjs'$apost';' src/main.ts
    

    所以对于上面的例子,它会是:

    apost=\'
    sed 's/ones/one'$apost's/'
    

    我不知道为什么 \' 不能单独工作,但确实如此。

    【解决方案7】:

    我知道这听起来像是一个警察,但当字符串中同时存在单引号和双引号时,我永远无法让 sed 工作。为了帮助像我这样遇到麻烦的新手,一种选择是拆分字符串。我不得不替换 100 多个 index.hmtl 文件中的代码。字符串有单引号和双引号,所以我只是拆分字符串并将第一个块替换为 &lt;!-- 和带有--&gt; 的第二个块。它把我的 index.html 文件弄得一团糟,但它确实有效。

    【讨论】:

      【解决方案8】:

      使用替代的字符串分隔符,如“:”,以避免与不同的斜杠混淆

      sed "s:ones:one's:" <<< 'ones thing'
      

      或者如果您想突出显示单引号

      sed "s:ones:one\'s:" <<< 'ones thing'
      

      都返回

      one's thing
      

      【讨论】:

      • 这根本不是问题所在; OP 的代码没有斜杠。这是对一个完全不同的问题的一个很好的答案,但是这个问题之前已经在这个网站上回答了数百次。
      【解决方案9】:

      AppleMacOSX 终端上的一些转义失败了:

      sed 's|ones|one'$(echo -e "\x27")'s|1' &lt;&lt;&lt;'ones thing'

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-06
        • 1970-01-01
        • 2011-11-22
        • 2019-04-01
        • 2017-09-13
        • 2020-01-31
        • 2017-08-05
        • 2011-11-17
        相关资源
        最近更新 更多