【问题标题】:Sed with both " and ' in insert string在插入字符串中同时使用 " 和 ' 的 Sed
【发布时间】:2014-04-23 15:22:07
【问题描述】:

我在 Ubuntu 中使用 sed 命令来制作 shell 脚本。

我有一个问题,因为我插入的字符串既有单引号也有双引号。破折号也。这是一个例子:

sed -i "16i$('#myTable td:contains("Trunk do SW-BG-26, GigabitEthernet0/22")').parents("tr").remove();" proba.txt

应该插入

$('#myTable td:contains("Trunk do SW-BG-26, GigabitEthernet0/22")').parents("tr").remove(); 

在 proba.txt 文件的第 16 行

但它会插入

$('#myTable td:contains( 

因为它过早退出。如何解决这个问题,我在现场找不到解决方案,因为我有两个引号,并且只有一种解释。

第二次尝试

除了最外面的双引号外,我在每个双引号前面都设置了 \,但我仍然没有得到我想要的。结果是:

.parents("tr").remove();

然后我把 \ 也放在每个 ' 前面,但结果是脚本出错。这是第 4 行:

sed -i "16i$(\'#myTable td:contains(\"QinQ隧道-SCnet无线\")\').parents(\"tr\").remove();" proba.txt

这是错误:

4:skripta.sh:语法错误:“(”意外(预期“)”)

如果该行有“,”,/?

第三次是魅力

昨天插入很多行我在使用 sed 时遇到了另一个问题。我想插入这段文字:

$(document).ready(function() {

使用命令:

sed -i "16i$(document).ready(function() {" proba.txt

结果我得到这个作为文档插入的文本是特殊的,或者是因为 $:

.ready(函数() {

对此有什么想法吗?

【问题讨论】:

  • stackoverflow.com/q/11995353 ... 使用反斜杠转义双引号。
  • 双引号之后还是之前的反斜杠?编辑:对不起,我没有看到那个链接。我试试看。
  • 反斜杠在引号之前。您必须在每个报价中使用它(可能最外面的报价除外)。
  • 除了最外面的双引号外,我在每个双引号前面都设置了 \,但我仍然没有得到我想要的。结果是:.parents("tr").remove();然后我把 \ 也放在每个 ' 前面,但结果是脚本错误。这是第 4 行: sed -i "16i$(\'#myTable td:contains(\"QinQ tunnel - SCnet wireless\")\').parents(\"tr\").remove();" proba.txt 这是错误:4:skripta.sh:语法错误:“(”意外(预期“)”)

标签: replace sed insert


【解决方案1】:

有两种方法可以解决这个问题。简单的方法是将脚本放入一个文件并在命令行上使用它。例如,sed.script 包含:

16i\
$('#myTable td:contains("Trunk do SW-BG-26, GigabitEthernet0/22")').parents("tr").remove();

然后你运行:

sed -f sed.script ...

如果您想在没有文件的情况下执行此操作,那么您必须决定是在 sed -e 表达式周围使用单引号还是双引号。使用单引号通常更容易;没有其他特殊字符需要担心。每个嵌入的单引号都替换为'\'':

sed -e '16i\
$('\''#myTable td:contains("Trunk do SW-BG-26, GigabitEthernet0/22")'\'').parents("tr").remove();' ...

如果你想使用双引号,那么每个嵌入的双引号需要替换为\",但你还必须转义嵌入的反引号`、美元符号$和反斜杠\

sed -e "16i\\
\$('#myTable td:contains(\"Trunk do SW-BG-26, GigabitEthernet0/22\")').parents(\"tr\").remove();" ...

(重点是:在检查带双引号的脚本之前,我忘记转义$;我第一次得到带单引号的脚本。)

由于所有额外的检查,我几乎总是使用单引号,除非我需要将 shell 变量替换到脚本中。

【讨论】:

  • 谢谢,我会在早上尝试使用单引号。告诉我如果我使用 sed.script 为什么它与在控制台中写下来不同?我有 100 行要插入与此类似的行,所以我必须制作文件,如果使用 sed 脚本比制作 bash 脚本更容易的话。
  • sed 直接读取文件,shell 不解释任何内容。为了使数据通过外壳,所有转义都是必要的。 sed 看到的内容与文件中的内容相同;这只是说服 shell 将文件中的数据传递给 sed 的问题,尽管它通常有助于扩展变量和删除引号等规则。
  • 我在主窗口写了另一个关于这个的问题,如果可以的话请看一下。谢谢!
  • 您需要阅读我的答案——您需要在 $ 符号前添加转义符(反斜杠)。事实上,你有一个程序document,当没有给出命令参数时它会安静地退出。 $(document) 捕获来自document 命令的输出并将该文本包含在sed 脚本中。这就是我使用单引号的原因!
  • 很抱歉强迫你,但我要到早上(8 小时内)才能尝试这个,我正在努力获得尽可能多的帮助,这样我就可以开始工作了早晨。你是真正的苍白和一颗心,而我只是这方面的初学者。
【解决方案2】:
sed -i "6 i\\
\$('#myTable td:contains(\"Trunk do SW-BG-26, GigabitEthernet0/22\")').parents(\"tr\").remove();" proba.txt

由于双引号 shell 解释,在 i 指令和 $ 之后需要转义双引号、斜杠和新行

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2013-11-24
    相关资源
    最近更新 更多