ファイルに「content」行がすでに含まれているかどうかを確認するには?

ファイルに「content」行がすでに含まれているかどうかを確認するには?

コンテンツ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

awks関数を使用すると、index運が良くなる可能性があります。と同じであるため(パターンマッチングでstrstrはなく)比較に適している必要があります。grep

答え4

これを行うには、sedを使用できます。問題は、コードに文字列を2回含める必要があることです。一度テストした後、再接続してみてください。

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

関連情報