パターンマッチングに基づいてあるファイルから別のファイルに行を移動するには?

パターンマッチングに基づいてあるファイルから別のファイルに行を移動するには?

テキストファイルの行を別のテキストファイルに移動したいと思います。この行には、下線で始まる単語が含まれています。この単語は次の場所にあります。六度音程行フィールドはスラッシュで区切られます。たとえば、_Nokia次の例の入力ファイルで、6番目のフィールドを含む行を移動します。

Apple/One-plus/Samsung/Mi/Sony/_Nokia/
Apple/One-plus/Samsung/Mi/Lenovo/_Nokia/
Apple/One-plus/Samsung/Mi/HTC/OPPO/

正規表現を使用してその行を移動しようとしましたが、grep機能しません。

$ grep -F 'Apple/One-plus/Samsung/Mi/^[a-zA-Z]([\w -]*[a-zA-Z])?$/_Nokia/' match.txt >file1.txt
$ grep -F -v "Apple/One-plus/Samsung/Mi/^[a-zA-Z]([\w -]*[a-zA-Z])?$/_Nokia/" match.txt \
    > match.txt.tmp && mv match.txt.tmp match

期待される出力

$ cat file1.txt
Apple/One-plus/Samsung/Mi/Sony/_Nokia/
Apple/One-plus/Samsung/Mi/Lenovo/_Nokia/
$ cat match
Apple/One-plus/Samsung/Mi/HTC/OPPO/

パターンマッチングに基づいてあるファイルから別のファイルに行を移動するには?

ベストアンサー1

オリジナル

-F関連オプションを使用して正規表現を指定することはできませんgrep。正規表現に関する質問もあります。この文字が^行の先頭に一致するようにアンカーとして使用される場合は、正規表現の最初の文字でなければなりません。

prompt% cp -v input input.back
prompt% grep -e "$regex" input.back > output
prompt% grep -v "$regex" input.back > input

正規表現:原作者が具体的な入力を提供しなかったので、適切な正規表現を見つけることは困難でした。

編集する:最後に、元のポスターはサンプル入力ファイルを提供します。

Apple/One-plus/Samsung/Mi/Sony/_Nokia/
Apple/One-plus/Samsung/Mi/Lenovo/_Nokia/
Apple/One-plus/Samsung/Mi/HTC/OPPO/

正規表現: regex

regex='\([-[:alpha:]]\+\/\)\{5\}_Nokia\/'

代替ソリューション

これらの同様の解決策は、sedマニュアルを読んだことがない初心者にはお勧めできません。

sed -n "/$regex/p;/$regex/d;w input" input.back > output

大まかに言えば、正規表現に一致する行をファイルに保存し、そのoutputsedバッファからそれを削除し、バッファの内容をファイルに書き込みますinput

sed -i.back -e "/$regex/w output" -e "/$regex/d" input

このコマンドには微妙な違いがありますが、2番目のコマンドがより便利です。

おすすめ記事