ファイルに変更を保存せずに2つのsedをマージします。

ファイルに変更を保存せずに2つのsedをマージします。

sedを使用して、ファイル内の単語と単語を含むコメント行を読み取って検索し、保存すると、\などの特殊記号をファイルから削除できますが、\はそのまま残りますか?

私の言葉は、会社名(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{

フィールド区切り記号を区切りに設定すると、3つのフィールドが表示され、次に設定されます\\\

        OFS="\\"} 

途切れた部分がある場合は、印刷時に再度集めてください。

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

会社の場合は、分割して複数の\フィールドで終わるかどうかを確認し、最後のNR>12つのフィールドまたは分割されていないフィールドで適切にテストしてください。

一致するものがある場合printf #(つまり、改行なしで印刷されます)

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

複数のフィールドがある場合は、NF>1会社名を分割して\\?印刷するときにフィールドが空白であることを確認するには、最後のフィールドの最初の文字を削除してスペースに置き換えます。?

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

印刷して

;1' file1

関連情報