如何在sed中避免单引号?

如何在sed中避免单引号?,sed,escaping,quote,Sed,Escaping,Quote,如何在已被引号包围的sed表达式中转义单个引号 例如: sed 's/ones/one's/' <<< 'ones thing' sed's/ones/one's/”一个技巧是使用相邻字符串的shell字符串串联,并使用shell转义来转义嵌入的引号: sed's/ones/two''s/'最好的方法是使用$”一些带引号的字符串 例如: sed$'s/one/two's/”Quotesed双引号代码: $ sed "s/ones/one's/"<<<

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

例如:

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

sed's/ones/one's/”一个技巧是使用相邻字符串的shell字符串串联,并使用shell转义来转义嵌入的引号:


sed's/ones/two''s/'最好的方法是使用
$”一些带引号的字符串

例如:


sed$'s/one/two's/”Quote
sed
双引号代码:

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

$sed“s/ones/one's/”我知道这听起来像是在逃避责任,但当字符串中有单引号和双引号时,我永远无法让sed工作。为了帮助像我这样有困难的新手,一个选择是拆分字符串。我必须替换100多个index.hmtl文件中的代码。字符串既有单引号也有双引号,所以我将字符串拆分,并将第一个块替换为

。它把我的index.html文件弄得乱七八糟,但它起了作用。

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

$ sed "s/ones/one's/" <<< 'ones thing'
one's thing
如果字符串中有单引号和双引号,也可以。只要避开双引号

$ 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添加单引号并删除一些双引号

$ 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的/ones/one/'
中的
\'
工作。我查这个是为了制作一个shell脚本,它将自动添加
import'hammerjs'到我的
src/main.ts
文件,带有角度

我所做的工作是:

apost=\'
sed -i '' '/environments/a\
import '$apost'hammerjs'$apost';' src/main.ts
因此,对于上述示例,它将是:

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

我不知道为什么
\'
本身不起作用,但事实就是如此。

在AppleMacox终端上的一些转义失败,因此:


sed的| ones | one'$(echo-e“\x27”)'s | 1'使用类似“:”的可选字符串分隔符以避免与不同的斜杠混淆

sed "s:ones:one's:" <<< 'ones thing'
以3种不同方式转义单引号: 从脆弱到坚实

1.使用双引号将sed脚本括起来: 最简单的方法:

sed "s/ones/one's/" <<< 'ones thing'
将一直工作到整个sedscript不包含空格、分号、特殊字符等。。。(易碎!)

2.使用八进制或十六进制表示: 这种方法简单有效,但可读性不如下一种方法

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

sed 's/ones/one\x27s/' <<< '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

简短答案的可能重复是“”——提出的解决方案都很有效。这似乎不适用于
sed-i
,有什么特别的原因吗?应该注意的是,周围带双引号的sed命令允许shell对这些命令进行插值,并可能导致不可预见的问题。这导致了我一直在寻找的答案,结果是:
echo“one's thing”| sed's/\x27/\\\''”“/g”
>
$one's thing
这是否适用于
sed-i
,这是一个模糊的问题。不是所有的
sed
方言都接受像
\x27
这样的十六进制代码,不管您是否传入
-i
标志。@matttrach Simplier:
echo“one's thing”| sed's/\x27/\\\&/g'
C风格的
$'string'
是特定于Bash的,因此它不能移植到POSIX shell。它不是特定于
Bash
的。它也可以在
ksh
zsh
中使用,但是,是的,它是POSIX的一个扩展,如果您不编写可移植脚本,这是很好的。唯一的缺点是你也必须避免使用任何其他反斜杠。也许有一个更简单的变体:sed's/ones/two's/'@gregory:
sed's/ones/two's/'@wisbucky与我在zsh上使用的sed版本(FreeBSD/macOS)相比,它肯定会输出“two's thing”。让我知道,这真是帮了大忙,shell然后缝合在一起。这是因为解释了正确的解决方法。谢谢!我爱regex,爱sed,现在我爱你,这基本上重复了2014年的公认答案。这根本不是问题所在;OP的代码没有斜杠。这是对一个完全不同的问题的一个很好的回答,然而这个问题在这个网站上已经被回答了数百次。
one's thing
sed "s/ones/one's/" <<< 'ones thing'
sed s/ones/one\'s/ <<<'ones thing'
sed 's/ones/one\o047s/' <<< 'ones thing'

sed 's/ones/one\x27s/' <<< 'ones thing'
sed 's/ones/one\o47s/' <<< 'ones thing'
which sed
/bin/sed
cat <<"eosedscript" >sampleSedWithQuotes.sed
#!/bin/sed -f

s/ones/one's/;
eosedscript
chmod +x sampleSedWithQuotes.sed
./sampleSedWithQuotes.sed <<<'ones thing'
one's thing
#!/bin/sed -f

s/ones/one's/;