以下のように unix/Linux 括弧の間の単語を変更したいと思います。コードを1つだけ含めると、作業が簡単になるように自動化したいと思います。
私のkshスクリプトには次の文字列があります
echo "Export file to below names (ABC, DEF, GHI)"
私は次のようになりたい
echo "Export file to below names ('ABC', 'DEF', 'GHI')"
答え1
$ echo "Export file to below names (ABC, DEF, GHI)" | sed -e "s/\([A-Z][A-Z][A-Z]\)/'\1'/g"
Export file to below names ('ABC', 'DEF', 'GHI')
答え2
Perlでは、ほとんど読みやすい方法で:
echo "Export file to below names (ABC, DEF, GHI)" |
perl -lne '@a = /(.*\()(.*)(\).*)/; $a[1] =~ s/\w+/\x27$&\x27/g; print @a'
最初の一致は、行を3つの部分に分割し、すべての(.*\()
項目、つまり開き括弧()の前のすべての項目、すべての項目((.*)
)、および閉じ括弧((\).*)
)の前のすべての項目をキャプチャします。これを配列に入れ、@a
2番目の要素を置き換えます(0から計算)。s/\w+/\x27$&\x27/g
「単語文字」()に一致する文字列を一重引用符で囲まれた一致部分に置き換えます
\w+
。$&
引用符は、シェルとの迷惑な引用ダンスを避けるために16進数でエスケープされます。
もちろん、Perlを使用すると、他の置換内でsedスタイルの置き換えを実行するなど、読み取れない操作も実行できます。
echo "Export file to below names (ABC, DEF, GHI)" |
perl -pe 's,\(.*\), $_ = $&; s/\w+/\x27$&\x27/g; $_ ,e; '
Export file to below names ('ABC', 'DEF', 'GHI')
ここで、final はe
外部置換で置換を Perl コードの断片として解釈し、ここで一致する部分を取得して$&
上記のように編集します。読み取り専用な$_
ので、ここでは一時変数として使用しています。$&
置換されたフラグメントを関数に移動できるため、その行を読みやすくすることができます。