他のファイルから正規表現で終わる行を削除する

他のファイルから正規表現で終わる行を削除する

事件がありますこれに似てしかし、いくつかの違いがあります。

コンテンツリストA:

.co
.best.co
.com
.test.server.cloud.us-east.amazonaws.com
.com.co
.abc.com.co
.jp
.def.museum.hiroshima.jp
.net
.xyz.xxx.yyy.net
.exe
.xyz.exe
# and anything else i want to add

コンテンツリストB:

.bar
.co
.com
.server.cloud.us-east.amazonaws.com
.com.co
.jp
.museum.hiroshima.jp
.net
.xxx.yyy.net
# and anything else i want to add

私が望むのは、「listB」に現れるもので終わらない行を「listA」から削除して重複することです。

希望の出力:

.best.co
.test.server.cloud.us-east.amazonaws.com
.abc.com.co
.def.museum.hiroshima.jp
.xyz.xxx.yyy.net

いくつかのコマンドを試しましたが、うまくいきません。

grep -vi -f <(sed 's:^\(.*\)$:\\\1\$:' listB ) listA > out
grep -v -f <(sed 's/$/$/' listB ) listA > out

事前にありがとう

答え1

$ grep -x -f <(sed 's/\./\\./g;s/^/.*/' listB) <(grep -v -F -x -f listB listA)
.best.co
.test.server.cloud.us-east.amazonaws.com
.abc.com.co
.def.museum.hiroshima.jp
.xyz.xxx.yyy.net

2つのコマンドとして解釈されます。

1.)grep -v -F -x -f listB listA

それからリテラルの重複を排除し、listAこの出力を2番目の出力の入力として使用しますgrep。これにより、次の項目が残りますlistA

.best.co
.test.server.cloud.us-east.amazonaws.com
.abc.com.co
.def.museum.hiroshima.jp
.xyz.xxx.yyy.net
.exe
.xyz.exe

(削除する残りの行:.exe.xyz.exe

2.)grep -x -f <(sed 's/\./\\./g;s/^/.*/' listB) <(...)

.の点をエスケープして先頭に追加listBし、再び行で終わる行を一致させます。入力は最初の結果です。.*greplistBgrep

答え2

# save valid extension from listB
vexts=($(sed "s/^.*\.//g" listB))
# loop over listA and filter desired output
while read line; do 
    if [[ " ${vexts[@]} " == *" ${line##*.} "* ]] ; then
        echo "${line}";
    fi
done < listA

関連情報