行をコメント化およびコメント解除する Bash スクリプト

行をコメント化およびコメント解除する Bash スクリプト

この間、お元気でお過ごしのことと思います。問題は、txt ファイル内のいくつかの行をコメントにしたいということです。複数の行をコメントにしたりコメント解除したりするコードはありますが、会社名を取得する方法がわかりません。私のテキスト ファイルには次のスキームがあります:lunar_static KKK_<countryname>_NUM 08.00.name

lunar_static KKK_USA_NUM 08.00.Winter
lunar_static KKK_ITALY_NUM 08.Winter
lunar_static KKK_ITALY_NUM 08.00.Spring
lunar_static KKK_ITALY_NUM 08.00.Autumn
lunar_static KKK_SPAIN_NUM 08.00.Winter
lunar_static KKK_SPAIN_NUM 08.00.Spring
lunar_static KKK_FRANCE_NUM 08.00.Autumn
lunar_static KKK_FRANCE_NUM 08.00.Autumn
lunar_static KKK_ITALY_NUM 08.00.Ferari-taxi
lunar_static KKK_ITALY_NUM "/^08\\.00\\.Delta\\ M$/"
lunar_static KKK_ROMANIA_NUM "/^08\\.00\\.Delta\\ M$/"
lunar_static KKK_ITALY_NUM "/^08\\.00\\.Red\\_Park$/"

そして、私はAutumn、Ferari-taxi、Delta M、Red_Parkという名前でITALYにコメントしたい。私はsedのようないくつかの名前にコメントする方法を知っています

sed -i '/Winter\|Spring/s/^/#/' file2.txt

コメントを外す

sed -i '/Spring/s/^#//' file2.txt

しかし、国名に関係なくすべての名前が選択されます。国を取得する方法がわかりません。予想される出力

    lunar_static KKK_USA_NUM 08.00.Winter
    lunar_static KKK_ITALY_NUM 08.Winter
    lunar_static KKK_ITALY_NUM 08.00.Spring
    #lunar_static KKK_ITALY_NUM 08.00.Autumn
    lunar_static KKK_SPAIN_NUM 08.00.Winter
    lunar_static KKK_SPAIN_NUM 08.00.Spring
    lunar_static KKK_FRANCE_NUM 08.00.Autumn
    lunar_static KKK_FRANCE_NUM 08.00.Autumn
    #lunar_static KKK_ITALY_NUM 08.00.Ferari-taxi
    #lunar_static KKK_ITALY_NUM "/^08\\.00\\.Delta\\ M$/"
    lunar_static KKK_ROMANIA_NUM "/^08\\.00\\.Delta\\ M$/"
    #lunar_static KKK_ITALY_NUM "/^08\\.00\\.Red\\_Park$/"

アドバイスを頂ければ幸いです。ありがとうございます!

答え1

検索ITALY語に対象国を含め、候補をグループ化し、 2つの検索語(Autumn|Delta....)の間にある文字を考慮する必要があります。.*

sed -E '/ITALY.*(Autumn|Delta.. M|Red.._Park|Ferari-taxi)/s/^/#/' file1

\それは脱出を避けるために少しチートをしています

sed -E '/ITALY.*(Autumn|Delta\\\\ M|Red\\\\_Park|Ferari-taxi)/s/^/#/' file1

同じファイル内で変更を加えるには、次のインプレース-iフラグを含めます。sed

sed -i -E .....

編集これを別の質問として投稿することもできましたが...

\\「...sed に入力せずに単語を見つけることは可能ですか\\\\?...」つまり、逃げる彼ら。

いいえ。その理由はここ:

'\'文字は、特定の通常の文字が続くと、特別な意味を持ちます。

したがって、一致する文字列で、 の後の文字\が予約済みのペアの 1 つを形成する文字 (例: \+、、\?)\nである場合sed、リテラルを探しているのか\n、改行を探しているのかをどのように判断すればよいでしょうか。

したがって、\文字どおりに読み取られることを意図している各文字はsed、それが予約文字シーケンスの一部ではないことを明示的に知らせるためにエスケープする必要があります。

関連情報