我在Ubuntu中使用sed命令来制作shell脚本。
我遇到了问题,因为我插入的字符串有单引号和双引号。破折号也。这是例子:
sed -i" 16i $(' #myTable td:contains(" Trunk do SW-BG-26, 接口GigabitEthernet0 / 22&#34)')父母(" TR"。)除去();" proba.txt
应该插入
$('#myTable td:contains("Trunk do SW-BG-26, GigabitEthernet0/22")').parents("tr").remove();
文件proba.txt的第16行
但是它会插入
$('#myTable td:contains(
因为它过早退出。如何解决这个问题,我在现场找不到解决方案,因为我有两个引号,只有一种解释。
第二次尝试
我在前面设置了每个双引号,除了最外面的引用但我仍然没有得到我想要的东西。结果是:
。家长(" TR&#34)除去();
然后我把\放在每个'也是,但结果是脚本错误。这是第4行:
sed -i" 16i $(\' #myTable td:contains(\" QinQ隧道 - SCnet无线\")\')。父母(\ " TR \&#34)除去();" proba.txt
这是错误:
4:skripta.sh:语法错误:"("意外(期待")")
如果该行有",',/?
,也许有更简单的方法可以在确切的行中将行插入到文件中第三次是魅力
去年插入了很多行我使用sed遇到了另一个问题。我想插入此文:
$(document).ready(function(){
使用命令:
sed -i" 16i $(document).ready(function(){" proba.txt
我得到的结果是,作为文档插入的文本是特殊的,或者是因为$:
.ready(function(){
有关于此的任何想法吗?
答案 0 :(得分:0)
有两种解决方法。简单的方法是将脚本放入文件中并在命令行中使用它。例如,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变量替换为脚本。
答案 1 :(得分:0)
sed -i "6 i\\
\$('#myTable td:contains(\"Trunk do SW-BG-26, GigabitEthernet0/22\")').parents(\"tr\").remove();" proba.txt
转义双引号,i
指令后需要的斜线和新行以及$
由于双引号shell解释