0

我曾经grep像这样找出文件中是否存在特定行:

my $grepval=`grep "$conn[$i]" filename`; 

这是正确的,但在此之后我现在想grepval使用 sed 从文件中删除,如下所示:

sed -i "s/$grepval//g" filename`; 

这给了我错误sed: -e expression #1, char 50: unterminated的命令`。请帮助解决它。谢谢

$grepval 中可能有一个 / 也可以是多行 - RC。39 分钟前

SA291 错误代码---->>> -3 ERROR_NO_RESULT_FOUND。这是我的 $grepval。我也使用了不同的分隔符,如下所示:sed -i "s|$grepval||g" /home/abc/Desktop/xyz。 txt.but 它仍然给我同样的错误。

4

6 回答 6

1

sed在调用之前将其放入您的代码中:

print "[$grepval]\n";

我保证在某个地方会有一个/,可能在第 48 个字符附近。

解决它的一种方法是进行预处理$grepval,以便将其转换为格式正确的搜索字符串,sed或者如果可能的话,选择一个您知道不会出现在字符串中的分隔符(sed允许不同的分隔符):

sed -i "s?$grepval??g" filename
于 2013-08-21T05:27:10.860 回答
1

如果替换/模式包含/,则不能/用作分隔符。

使用不同的分隔符:

sed -i "s|$grepval||g" filename
于 2013-08-21T05:27:45.453 回答
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`;  
}
于 2013-08-21T05:27:02.307 回答
0

有一个换行符$grepval(或另一个“隐藏”字符)。摆脱它chomp

此外,您可能会考虑使用列表形式system()来避免 shell 元字符出现问题(只是将参数放入""并不总是有帮助)并尝试转义可能的正则表达式元字符quotemeta()以使脚本更健壮。完全在 Perl 中完成整个事情会更好。例如,sed -i它不是可移植的,可能只在 Linux 系统上工作。

于 2013-08-21T07:15:30.617 回答
0

您必须使用 sed -i 而不是 sed -e 在文件中进行更改.. -e 用于表达式,而 -i 在您需要修改文件并在修改后保存时是必需的..也 chomp 也可以解决这个问题。 grepval var 可能会在末尾添加一个换行符。

萨米

于 2013-08-21T10:24:46.090 回答
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 需要同时具有 ' 和 "。有时需要告诉 shell 如何处理扩展。一个常见的地方是在测试子句中。你可以玩

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}"总是有效的。

于 2020-07-21T19:12:40.890 回答