sedを使用して別のファイルの1つのファイルから同じ行を削除する方法は?

sedを使用して別のファイルの1つのファイルから同じ行を削除する方法は?

2つのファイルがあり、1つはもう1つの親セットです。大きなファイルから小さいファイルの同じ行を削除したいと思います。

考えられる問題の1つは、その行にバックスラッシュが含まれていることです。

どうすればいいですか?

答え1

これは私の作品です。

remove_lines()
{
    # remove lines from a file 
    #  
    # $1 - source file with patterns of lines to be removed
    # $2 - destination file
    tmpfile=$(mktemp "$(dirname -- "$2")"/XXXXXXXX) &&
    grep -F -f "$1" -v -- "$2" >>"$tmpfile" &&
    mv -- "$tmpfile" "$2" &&
}

編集:ちょうどそれがそこにないことに気づきましたsed。しかし、それはあまり重要ではありません。そうですか?

答え2

@rajishの答えgrepは近いですが、何か落ちました。同じコンテンツの削除に関する質問ワイヤー。デフォルトではgrep一致します。ひも(ラインの一部)。

POSIX grep適切なオプションがあります。

-x
ターミネータを除いて、行のすべての文字を使用する入力行のみが考慮されます。新しいチーム完全固定文字列または正規表現を一致する行に一致させます。

これを考慮すると、grep次のようにすることができます。

cp -f -p input.txt input.txt~
grep -v -x -F -f input.pat input.txt~ >input.txt

どこEnter.pat削除する行が含まれています。入力.txt更新するファイルです。

@nvarunのソリューション使用 sedパターンファイルで文字をエスケープしないこと/を除いて、同様の問題があります。この例は私にとって効果的で、構文を次のように制限します。POSIX sed:

cp -f -p input.txt input.txt~
sed -e 's/\([\/]\)/\\\1/g' -e 's/^/\/^/' -e 's/$/$\/d/' input.pat > input.sed
sed -f input.sed input.txt~ >input.txt

きれいにするために、両方を更新する前に元のファイルを保存してください(POSIX CP)。

Enter.pat

first
this is second
second/third
second\third

入力.txt

first
only first should match
this is not first
this is second
the previous line said this is second
first/second/third
second/third
first\second\third
second\third

結果:

only first should match
this is not first
the previous line said this is second
first/second/third
first\second\third

答え3

次のスクリプトを試してください。

## $1 - Small File
## $2 - Large File

sed 's/^/\//; s/$/\/d/; s/\\/\\\\/g' $1 > $HOME/sed_scpt.txt
sed 's/\\/\\\\/g' $2 | sed -f $HOME/sed_scpt.txt > $HOME/desired_output.txt

## Alternatively, you could change the 2nd line with the following;
sed -f $HOME/sed_scpt.txt $2 > $HOME/desired_output.txt

注:私はGNU sed 4.2.1を使用しました。

関連情報