我使用grep
来查明文件中是否存在特定行,或者不是这样:
my $grepval=`grep "$conn[$i]" filename`;
这是正确的但在此之后我现在想要使用sed从文件中删除grepval
:
sed -i "s/$grepval//g" filename`;
给了我错误sed: -e expression #1, char 50: unterminated
s'命令`。
请帮忙解决问题。谢谢
可能还有$ in $ grepval它也可以是多线 - RC。 39分钟前
SA291错误代码---->>> -3 ERROR_NO_RESULT_FOUND。这是我的$ grepval.I使用了不同的分隔符,如下所示:sed -i“s | $ grepval || g”/home/abc/Desktop/xyz.txt.but它仍然给我同样的错误
答案 0 :(得分:1)
将它放在sed
调用之前的代码中:
print "[$grepval]\n";
我保证那里会有一个/
,可能在48号角落附近。
解决此问题的一种方法是预处理$grepval
,以便将其转换为sed
格式正确的搜索字符串,或者,如果可能,选择您知道不会的分隔符出现在字符串中(sed
允许使用不同的分隔符):
sed -i "s?$grepval??g" filename
答案 1 :(得分:1)
如果替换/模式包含/
,则您无法使用/
作为分隔符。
使用不同的分隔符:
sed -i "s|$grepval||g" filename
答案 2 :(得分:0)
您可以获得包含相关字符串的文件名列表
my @files = qx#grep -l $search_string $filenameExpression#;
foreach my $f ( @files )
{
chomp($f);
# make sure your input doesn't have slash "/" then use hash "#"
my $ret = `perl -pi -e's#$search_string##g' $f`;
}
答案 3 :(得分:0)
$grepval
(或其他“隐藏”字符)中有换行符。用chomp
删除它。
另外,您可以考虑使用system()
的列表形式来避免shell元字符的问题(只是将参数放入""
并不总是有帮助)并尝试使用{{1}转义可能的regexp元字符使脚本更健壮。更好的是在Perl中完成整个事情。例如,quotemeta()
不可移植,可能仅适用于Linux系统。
答案 4 :(得分:0)
你必须使用sed -i而不是sed -e来对文件进行更改。-e用于表达式,而当你需要修改文件并保存它们时需要-i修改..也chomp也可以解决这个问题.. grepval var最后可能会有一个换行符。
森美
答案 5 :(得分:0)
这很老了,但是出现在搜索中,并且至今没有正确的答案。
如果要使用sed进行替换,则需要防止在不需要的地方进行shell扩展,并在需要的地方强制执行。这里的错误意味着实际的sed搜索是针对'grepval'完成的,而不是针对'grepval'包含的实际错误进行的。
尝试:sed -i 's|'"${grepval}"'||g' xyz.txt
即为',后跟一个“,然后是$ {,并且在}之后是相反的顺序>
由于字体很难阅读而添加!
示例(使用管道符号作为分隔符):
# grepval="THIS"; echo $grepval; echo "${grepval}"; echo '"${grepval}"'
#THIS
#THIS
#"${grepval}"
#'字符限制了shell的扩展
# echo "THIS is a mess" > test.txt
# sed -i 's|'"${grepval}"'|THAT|g' test.txt ; cat test.txt
#THAT is a mess
#和sed然后在s //命令内替换。
sed需要同时具有'和'。有时外壳需要被“告知”如何进行扩展。一个常见的地方是测试子句。您可以使用
if [ $grepval = "THAT" ] ; then echo "yes" ; else echo "no"; fi
if [ ${grepval} = "THAT" ] ; then echo "yes" ; else echo "no"; fi
if [ "$grepval" = "THAT" ] ; then echo "yes" ; else echo "no"; fi
if [ "${grepval}" = "THAT" ] ; then echo "yes" ; else echo "no"; fi
了解发生的情况。 (并且整个“ $ {grepval}” 总是有效。