0

問題:

で囲まれたファイル内のテキストの断片を検索します@

入力:

@abc@ abc @ABC@
cba @cba@ CBA

出力:

@abc@ @ABC@
@cba@

私は次のことを試しました:

cat test.txt | perl -ne 'BEGIN { $/ = undef; } print $1 if(/(@.*@)/s)."\n"'

しかし、これは次の結果になります。

@abc@ abc @ABC@
cba @cba@

追加:私は完全ではありませんでした。上記の目的は、@の間の文字を別のものに置き換えることです。aはchr(0x430)になりますbはchr(0x431)になりますcはchr(0x446)になりますAはchr(0x410)になりますBはchr(になります0x411)Cはchr(0x426)になるはずなので、上記の入力を念頭に置くと、次のようになります。 абц abc АБЦ cba цба CBA

私の不完全さをお詫びします。Klutherに感謝します

4

5 に答える 5

1

問題は貪欲で(@.*@)あること*です: それは可能な最大量に一致します. @したがって、文字列の最初と最後の間のすべてに一致します。

で非貪欲にすることができます(@.*?@)。ただし、より良いアプローチは@、間にないすべてのものを一致させることです。

 (@[^@]*@)

最初の出現ではなくすべての出現に一致させたい場合は、/g修飾子を使用し、ループを使用するようにコードを変更する必要もあります。

perl -ne 'BEGIN { $/ = undef; } print $1 while(/(\@[^@]*\@)/gs); print "\n"'
于 2013-03-08T09:32:15.497 に答える
0

一方通行:

$ perl -pe '@a=$_=~/@[^@]+@/g; $_="@a";' file
@abc@ @ABC@ @cba@
于 2013-03-08T09:31:09.587 に答える
0

このようなパターンを使用する

@[a-zA-Z]+@
于 2013-03-08T09:21:55.777 に答える
0

次の正規表現を使用します。

cat test.txt | perl -pe 's/(?:(@ )|^[^@]).*?(?: (@)|$)/$1$2/g'
于 2013-03-08T09:26:26.380 に答える
0

貪欲でない検索.+?またはを使用し/(\@([^@]*)\@)/gsmます。

cat test.txt | perl -ne 'BEGIN { $/ = undef; } print $1." " while(/(\@([^@]*)\@)/gsm); print "\n";'
于 2013-03-08T09:27:48.893 に答える