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