2017-11-18 19 views
0

source、correct、wrong、not_foundの4つのファイルがあります。私はbashにスクリプトを書こうとしています。ここで、sourceという名前のファイルから各行を読み込み、変数xとしてその行を格納し、それを条件と照合します。Bash:変数に一致するファイルから行を削除する

もし私が正しい名前のファイルにその行を書き込む必要がありますが、キャッチが正しく書かれる前に変数xが現在ファイルに存在するかどうかをチェックする必要があります。正しい名前のファイルに行を追加します。

私は以下試してみましたが、それは、ファイルを修正していないし、どちらも私に任意の出力を与えていない:

sed -i '/$x/d' ./wrong 
+0

私はあなたが 'send'ではなく' sed'を意味すると思います。一重引用符を使用すると展開されないので、実際にはその変数の内容ではなく '$ x'(文字通り)を検索しています。 'sed -i"/$ x/d "/ wrong" –

+0

エラーを指摘してくれてありがとう。実際には私のiPadは自動修正を行っていた。私は今、エラーを修正しました。 –

+0

'sed'はファイルを変更しません。標準入力から読み込み、標準出力に書き込みます。結果をどこかに置き、元のファイルに置き換える必要があります。 'sed -i '/ $ x/d' ./wrong> ./wrong.new && mv ./wrong ./wrong.old && mv ./wrong.new。/ wrong'(もしあなたが古いもののコピー)。 – fernand0

答えて

0

あなたは既に理解してきたように、'...'内部変数は展開されません。

あなたは二重引用符、 で単一引用符を交換した場合、これは./wrongから、一致する行を削除します:

sed -i "/$x/d" ./wrong 

しかし、あなたはまた、試合があった場合、./correctに行を追加します。 これを行うには、あなたがsedgrepを実行することができます。

grep "$x" ./wrong >> ./correct 

これは、所望の効果を持つことになります、 しかしsedは、それがする必要がない場合でも、./wrongが上書きされます。 このようなことを防ぐことができます:

if grep "$x" ./wrong >> ./correct; then 
    sed -i "/$x/d" ./wrong 
fi 
+0

Janosさん、ありがとうございました。実際には、xとそれに続く次の2行を含む行を./wrongから削除する必要があります。また、 –

+0

Janosさん、ありがとうございました。実際には、xとそれに続く2行を含む行を./wrongから削除する必要があります。だからgrep "$ x" ./wrong;then; sed -i "/ $ x /、+ 2d" ./wrong;echo $ x >> ./正解; echo line2 >> ./正解: fiこのifループの前に、別のforループを実行して、line2とline3を保持します。 xを間違って削除するかどうかは、line2とline3によって決まります。したがって、xと次の2行を含む行を間違って直接間違ってコピーすることはできません。 –

+0

@DattarayaHonraoあなたは元の質問の一部ではない重要な新しい詳細を追加しています。あなたが本当に必要とするすべての詳細を含む新しい質問をする方が良いでしょう。 – janos

関連する問題