1行に複数回存在する2つのシンボル間のパターンを削除します。

1行に複数回存在する2つのシンボル間のパターンを削除します。

次のようなファイルがいくつかあります(と呼びますfile1)。

(((1824663.AST0201.AST0202.AST0016...AST0087:0.2575,225845.AST0201.AST0202.AST0016...AST0087:0.717227):0.45328,190304.AST0201.AST0202.AST0016...AST0087:...........

AST*常に最後の項目の後の前と後の間のすべての項目を削除したいと思います。このパターンは連続して複数回発生します。ここに示されているのは正確なレプリカですが、他の行に似たものがたくさんあります。.AST*:.AST*AST*AST

私が現在やっていることは、ファイルを分割してすべてを削除してから、各行を1行にASTリンクすることです。

sed 's/:/:\n/g;s/,/,\n/g' file1 | sed 's/\.AST.*:/:/g' | sed -z 's/\n//g'

予想出力:

(((1824663:0.2575,225845:0.717227):0.45328,190304:...........

sedこれを要求するより短いコマンドがありますか?

答え1

あなたはこれを試すことができますsed

$ sed -E 's/\.AST[^:]*//g' input_file
(((1824663:0.2575,225845:0.717227):0.45328,190304:...........

答え2

使用幸せ(以前のPerl_6)

~$ raku -pe  's:g/ [ AST \d+ ]+ % \.+ //;'  file

入力例:

(((1824663.AST0201.AST0202.AST0016...AST0087:0.2575,225845.AST0201.AST0202.AST0016...AST0087:0.717227):0.45328,190304.AST0201.AST0202.AST0016...AST0087:...........

出力例:

(((1824663.:0.2575,225845.:0.717227):0.45328,190304.:...........

RakuはPerlプログラミング言語スイートです。ここでは、-peおなじみの自動印刷行別フラグ(sedに似ています)が使用されます。上記の正規表現は、ポイントが.レコードまたは要素の区切り記号であると仮定して作成されました。したがって、求めずに.ASTリード.ポイントを変わらずに維持することが理にかなっています。

Raku正規表現の新機能は、繰り返される要素の数量子を変更することです。簡単に言うと、同じパターンがある場合は、 AST \d+括弧でグループ化し、数量子を追加して[ AST \d+ ]繰り返し回数を示します[ AST \d+ ]+

通常、上記のコードは同時に実行されるパターンの複数のインスタンスのみを認識しますが、次のことが可能です。数量子の変更% \.+パターンを表すインジケータ[ AST \d+ ](「1つ以上の点で区切られた%」)。この構成は、区切り文字が失われた場合(trueの場合)などのパターンが削除されるオプションの正規表現のみを使用した場合に発生する問題を回避します。また、変更された数量子を使用して、最初のターゲット要素を除くすべての要素、または最後のターゲット要素を除くすべての要素を削除できます。\.+.\.?AST0AST1

入力例:

echo '(((1824663.AST0101:AST0201.AST0202:AST301.AST302.AST303:AST0401.AST0402.AST0403.AST0404:)))' > test_AST.txt

1行ずつ出力(スペースを含む):

~$ raku -pe  's:g/ [ AST \d+ ]+  //;' test_AST.txt
(((1824663.:.:..:...:)))
 
~$ raku -pe  's:g/ [ AST \d+ ]+ % \.  //;' test_AST.txt
(((1824663.::::)))
 
~$ raku -pe  's:g/ [ AST \d+ ]**2..* % \.  //;' test_AST.txt
(((1824663.AST0101::::)))
 
~$ raku -pe  's:g/ [ AST \d+ ]**3..* % \.  //;' test_AST.txt
(((1824663.AST0101:AST0201.AST0202:::)))
 
~$ raku -pe  's:g/ [ AST \d+ ]**4..* % \.  //;' test_AST.txt
(((1824663.AST0101:AST0201.AST0202:AST301.AST302.AST303::)))
 
~$ raku -pe  's:g/ [ AST \d+ ]**5..* % \.  //;' test_AST.txt
(((1824663.AST0101:AST0201.AST0202:AST301.AST302.AST303:AST0401.AST0402.AST0403.AST0404:)))

https://docs.raku.org/言語/regexes
https://raku.org

関連情報