sedで特定の文字を含む行のフィルタリング

sedで特定の文字を含む行のフィルタリング

ソートされていない単語のリストが2つあり、選択した特定の文字を除く新しい単語のリストを作成して、順番にソートしたいと思います。次のコマンドを試しました。

 cat roa7.lst gr7.usl | sed -e 's/\s/\n/g' | sed -n 's/[^hlrw]/&/p' | sort -u | less -N

ただし、最後のsedコマンドは文字セットを含む行を除外しようとしましたが、これらの[hlrw]単語の除外に失敗しました。どういうわけか、私は区切り文字の中のカラットの使いやすさを逃しました。このパイプをどのように修正しますか?

答え1

最後のコマンドの正しい構文sedは次のとおりです。

sed -n '/[hlrw]/!p'

または

sed '/[hlrw]/d'

ほぼ同じです。そのawk手順は次のとおりです。

awk '!/[hlrw]/'

元の例では、誤ったコマンドは「セットにない文字を含みます」(行が、、または文字でhlrw完全に構成されていない限り正しいものです)を意味し、2番目のコマンドは「セットにない文字を含む文字を探してください」です。 「セット」の「設定」行を印刷し、「セットを含む行を見つけて」入力から削除します。hlrwhlrwhlrw

答え2

しかし、ここではそうする必要はありませんsed。次のことができます。

grep -v '[hlrw]'

最初の(非標準)項目は次のようsed -e 's/\s/\n/g'に置き換えることもできます。

tr -s '[:space:]' '[\n*]'

すべての空白シーケンスを改行文字に変換して圧縮します。

これは実際に使用を正当化します(ファイル名を引数として使用して直接読み取ることができるので、cat必要ありません)。sedsed

したがって、代替構文は次のようになります。

cat roa7.lst gr7.usl | tr -s '[:space:]' '[\n*]' | grep -v '[hlrw]' | sort -u | less -N

これを行うとsed

関連情報