1行に1つずつ複数の文字列を含むファイルがあります。回文が含まれており、回文が角かっこの間にない場合にのみ、文字列を検索して印刷したいと思います。例:
abba[cdef]gh # print
abcd[effe]gh # do not print
現在の文字列が回文の場合、1行を印刷する1行コードがあります。
awk 'BEGIN { system("perl -lne \"print if length == 4 && reverse eq \\$_\" " ARGV[1]) }' words.txt
以下で修正ここ。
私はsed
角かっこの間のすべてを削除し、残りの回文を評価することを検討しています。
一行でこれを行う方法についての他のアイデアはありますか?
ベストアンサー1
3 つ以上の文字で構成される回文を 1 つだけ除いてすべてを検索するには、次の手順を実行します[...]
。
$ echo 'cac[ada]abacab' | perl -nle '
while (/\[.*?\]|(?=(([^][])(?1)\2|[^][]?))./g) {
print $1 if length $1 >= 3
}'
cac
aba
bacab
aca
(単一バイト文字を想定し、-Mopen=locale
文字のロケール定義を追加します。)
回文マッチングの鍵は再帰正規表現です。回文は、空の文字列、単一の文字、または一致する文字のペアとその間にある他の回文と一致します。つまり((.)(?1)\2|.?)
、(?1)
再帰部分は(の最初の部分と一致しますが、ここでは(およびを除くすべての文字)に()
置き換えます。.
[^][]
]
[
マッチング時みんなが表示されると、/.../g
Perlは最初の発生後に次の発生を検索します。inがある場合は、inを最初に検索してから検索を続けるため、inが見つかりません\[.*?\]|(([^][])(?1)\2|[^][]?)
。したがって、ここでは、単一文字()が文字の先頭にある場合、その文字と一致する条件を一致させます。bacab
abacab
aba
aba
(?=(palindrome)).
.
回門その後でキャプチャされます$1
。これは、対応する単一文字を検索し続けることを意味します。
厳密に言うと、sをスキップして文字列内のすべての場所で最も長い(3文字以上)回文を見つける[...]
ため、見つからない可能性があります。みんなイベント。たとえば、最初の位置、3番目の位置、2番目の位置ではababa
検索されますが、最初の位置では検索されません。ababa
bab
aba
aba