如何检查文件中是否已包含“内容”行?

如何检查文件中是否已包含“内容”行?

我需要知道文件是否已准备好包含内容 X 的行,如果没有附加行。这是我尝试过的代码。

if ! $(grep 'eval $(perl -I$HOME/foo/lib/perl5 -Mlocal::lib=$HOME/foo)' ~/.bashrc)
then
    echo 'eval $(perl -I$HOME/foo/lib/perl5 -Mlocal::lib=$HOME/foo)' >> ~/.bashrc
fi

答案1

#!/bin/bash

LINE='eval $(perl -I$HOME/foo/lib/perl5 -Mlocal::lib=$HOME/foo)'

if ! grep -qF "$LINE" file.txt ; then echo "$LINE" >> file.txt ; fi

$(...) 将返回命令的结果,而不是错误级别值。无需命令替换即可使用以获得正确的返回代码。

答案2

要搜索文字字符串:

line='eval $(perl -I$HOME/foo/lib/perl5 -Mlocal::lib=$HOME/foo)'
file=~/.bashrc
if ! grep -q -x -F -e "$line" <"$file"; then
  printf '%s\n' "$line" >>"$file"
fi

-q抑制grep输出(您只对返回状态感兴趣)。-x要求整行匹配。-F搜索文字字符串而不是正则表达式。是以防万一以 开头的-e预防措施。$line-

答案3

您可能对awksindex函数有更好的运气:它相当于strstr,因此应该非常适合比较(而不是grep用于模式匹配)。

答案4

您可以使用 sed 来完成此操作。问题是您需要在代码中包含该字符串两次。一次测试它,再次插入它。

sed -i '/eval \$(perl -I\$HOME\/foo\/lib\/perl5 -Mlocal::lib=\$HOME\/foo)/!{ ${ s/$/\neval \$(perl -I\$HOME\/foo\/lib\/perl5 -Mlocal::lib=\$HOME\/foo)/; }; }' /path/to/file

相关内容