この間、お元気でお過ごしのことと思います。問題は、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
、それが予約文字シーケンスの一部ではないことを明示的に知らせるためにエスケープする必要があります。