如何在sed中避免单引号?
如何在已被引号包围的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 '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/"<<<"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/;