2つの記憶パターンを印刷し、その間に英数字以外の文字のみを印刷します。

2つの記憶パターンを印刷し、その間に英数字以外の文字のみを印刷します。

私はDebian 11でGNU sed 4.7を使用しています。

複数行のファイルがあり、すべての行には、行の先頭に中かっこで囲まれた最初の文字列があり、行の末尾にある文字の最後の文字列があり、行の間@に英数字、句読点、その他の文字を含む文字列があります。上記の文字列端末文字列です。

最初の文字列と最後の文字列全体を表示する出力を生成したいと思います。ただ中間文字列にアルファベット以外の文字があるので、

./file次のコンテンツが含まれています。

{string-no1}middle@string-no2@
{AAAAAAAAAA}1,a.B£@ZZZZZZZZZZ@
{GGGGGGGGGG}&:3m?J@@@@@@@@@@@@

...出力を見たいです。

{string-no1}@string-no2@
{AAAAAAAAAA},.£@ZZZZZZZZZZ@
{GGGGGGGGGG}&:?@@@@@@@@@@@@

私は試した:

sed 's/\({[^}]*}\)[^a-zA-Z0-9]*\(@[^@]*@\)/\1\2/' ./file

...しかし、これはうまくいかず、次のような場合でもうまくいきません。

sed 's/\({[^}]*}\)[[:punct:]]*\(@[^@]*@\)/\1\2/' ./file`

...でもない:

sed '/}/,/@/ s/[a-zA-Z0-9]*//' ./file

私はgrimoireとStackExchangeに助けを求めてみましたが、一般的にすべての問題を解決しましたが、この問題は本当に気に入りました。誰でも助けることができますか?

ベストアンサー1

これは実行するのが難しいですがsed(各入力行の3つの異なる部分で異なる操作を実行する必要があるためです。s///何もせず、変更し、何もしません)、これは簡単ですperl

$ perl -lne '($first,$middle,$last) = (/({[^}]*})([^@]*)(@.*)/);
             $middle =~ s/[[:alnum:]]+//g;
             print $first, $middle, $last' file 
{string-no1}@string-no2@
{AAAAAAAAAA},.£@ZZZZZZZZZZ@
{GGGGGGGGGG}&:?@@@@@@@@@@@@

まず、正規表現を使用して、入力行の最初、中間、最後の部分を適切な名前の変数として抽出します。次に、$ middleからすべての英数字を削除します。次に印刷します。

おすすめ記事