2017-02-16 67 views
1

我怎样可以用不同的线在一个文件中搜索字符串替换文本在bash与/

当前替换文件中的以下文本在Linux中:

0 22 * * * /scripts/application_folder_backup.sh >> /var/log/application_folder_backup.log 

更换行:#line_removed

我试过使用sed,但我的文件中的文件已经有一个/哪些是导致问题。我试图将字符串存储在一个变量中。但是,这是行不通的

#!/bin/bash 

var="0 22 * * * /scripts/application_folder_backup.sh >> /var/log/application_folder_backup.log" 

sed -i -e 's/$var/#line_removed/g' /tmp/k1.txt 

出口

+0

对'sed'命令使用双引号。我无法找到原来的问题将其作为重复关闭... – anishsane

+2

只有'/'不是问题,即使是'*'或所有特殊的正则表达式元字符都会成为'sed' – anubhava

+0

或使用'perl -pe's | \ Q $ var | #line_removed |“的问题。/tmp/k1.txt' ... – Sundeep

回答

-1

我建议以前到$var内容喂到sed脚本,逃避所有的/字符是\/,如:

var_esc=$(echo "$var" | sed 's/\//\\\//g') 

sed表情变得很复杂(必须使用单引号,如果你不想加倍\字符,因为双引号也解释反斜杠

另一件可以简化表达式的方法是使用改变正则表达式分隔符的可能性(使用不同的char b egin吧)为:

var_esc=$(echo "$var" | sed 's:/:\/:g') 

的想法是,取代$var变量之前,为了躲避所有可能interferring字符,你可以有(你不知道一个修道院,如果有将要作为您正在使用用于该目的的变量),然后替换他们在最后的命令:

sed "s/$var_esc/#line_removed/g" 

最后,如果你不想替代路线,只是删除它,你可以做这样的事情:

sed "/$var_esc/d" 

并且将删除与您的$var_esc内容匹配的所有行。 (这个时候,我相信你无法改变的正则表达式的分隔符,为/介绍匹配线运营商--- d是删除输出线中的命令)

另一种方式来删除线在你的文件直接调用ex并通过编辑器命令作为输入:

ex file <<EOF   <-- edit "file" with the commands that follow until EOF is found. 
/$var_esc    <-- search for first occurrence of $var_esc 
d      <-- delete line 
w      <-- write file 
EOF     <-- eof marker. 
+0

对不起,解释downvote的原因应该是礼貌的,因为不仅问题已经得到解答,而且它似乎也是选定的答案。我也想知道为什么我的答案似乎不适合每个人。 –

1

只是/是不是这里有问题,甚至*或所有特殊的正则表达式元字符将是sed一个问题,因为它仅使用正则表达式搜索模式。

最好使用此non-regex基于awk命令:

awk -v var="$var" 'index($0, var) { $0 = "#line_removed" } 1' file 

#line_removed 

indexawk功能使用纯文本搜索,而不是一个正则表达式基于搜索。

+1

不错的一个,很可能OP要检查整行,所以'$ 0 == var'也是一个选择 – Sundeep

+0

是的,对于全行精确匹配'$ 0 == var'是正确的做法。 – anubhava

+1

谢谢大家的帮助。解决 – user230994

相关问题