ファイルの変更を保存せずに 2 つの sed を結合する

ファイルの変更を保存せずに 2 つの sed を結合する

sed を使用してファイル word を読み込んで検索し、word を含む行をコメント化して保存するときに、\ のような特殊記号をファイルから削除することは可能ですか? ただし、\ はそのまま残ります。

つまり、会社名(2つの単語)のファイルがあり、その間にいくつかの文字があり、元のファイルではそれらの記号に文字エスケープ(正規表現)が使用されていました。たとえば

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$/"

\ を何も付けずにコメントアウトしましたが、以前と同じように \ を付けて保存したいと思います。出力は次のようになります。

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$/"

私のスクリプトは次のとおりです:

sed -E -e 's/\\//g' -i -e '/ITALY.*Delta M/s/^/#/' file.txt

しかし、\ なしで保存されます。はい、削除せずに Red\\\\ Park として検索できるのはわかっています。ただし、名前が 20 個ある場合、2 ~ 3 語で構成される会社名ごとに \\\\ と入力するのは嫌です:) または、sed ではなく別のコマンドで実行する別のビジョンをお持ちですか? あらゆるアドバイスや支援をお待ちしています。私が望むものを手に入れることは可能ですか? 本当にありがとうございます!

答え1

私が正しく理解しているなら、これがあなたにとってうまくいくかどうか見てみましょう:

sed -E -e 's/^(.*\w+)\\\\ /#\1\\\\ /' -e 's/\\\\.([^ ]*)$/\\\\ \1/ file

出力:

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$/"

答え2

粘り強さは美徳だとよく言われますが……

2 つの会社名はすべて\\1 文字以上で区切られており、国名は常に大文字で、すべての会社名には少なくとも 1 つの小文字が含まれている (つまり、会社名が国名の部分文字列になることはできない) と想定しています。

awkあなたの会社がこのオプションをサポートしている場合の解決策。-i inplaceほとんどの会社はそうしていると思います

awk -i inplace -v country="ITALY" -v company="Red.Park" -F'\\' 'BEGIN{
    OFS="\\"}
    $1~country && NR>1?$(NR-2)$NR:$1~company{
        printf "#"}
    NF>1{$NF=" "substr($NF,2)
    };1' file1
Output

#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$/"
lunar_static KKK_FRANCE_NUM "/^08.00.Green\\ Banana$/"

ウォークスルー

awk変更を加え-i inplace、国と会社を変数として渡すように指示します。ファイルの-v後に不明な区切り文字があるため、会社名の2つの部分の間に使用します。\\.

awk -i inplace -v country="ITALY" -v company="Red.Park" -F'\' 'BEGIN{

フィールドセパレータをbreakに設定する\と、3つのフィールドが\\生成され、

        OFS="\\"} 

中断があった場合は、印刷時に元に戻します。

最初のフィールド$1==countryが一致の最初の部分である場合。

会社の場合、分割して\複数のフィールドになったかNR>1どうかを確認し、必要に応じて最後の 2 つのフィールドまたは分割されていないフィールドに対してテストします。

一致した場合はprintf #(改行なしで印刷されます)

        $1~country && NR>1?$(NR-2)$NR:$1~company{
        printf "#"}

1つ以上のフィールドがありNF>1、会社名を区切っている場合は、印刷時に空白文字であること\\?を確認したいので、最後のフィールドの最初の文字を削除してスペースに置き換えます。?

    NF>1{$NF=" "substr($NF,2)

そして印刷

;1' file1

関連情報