我需要知道文件是否已准备好包含内容 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
您可能对awk
sindex
函数有更好的运气:它相当于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