한 줄에 여러 번 존재하는 두 기호 사이의 패턴을 제거합니다.

한 줄에 여러 번 존재하는 두 기호 사이의 패턴을 제거합니다.

다음과 유사한 파일이 여러 개 있습니다(라고 부르겠습니다 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

내가 현재 하고 있는 일은 파일을 분할하고 모든 것을 제거한 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+ ]("하나 이상의 점으로 구분됨 %"). 이 구성은 구분 기호가 손실되고 (true인 경우)와 같은 패턴이 제거되는 선택적 정규식만 사용할 때 발생하는 문제를 방지합니다. 또한 수정된 수량자를 사용하여 첫 번째 대상 요소를 제외한 모든 요소 또는 마지막 대상 요소를 제외한 모든 요소를 ​​제거할 수 있습니다.\.+.\.?AST0AST1

입력 예:

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

한 줄씩 출력(공백 포함):

~$ 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

관련 정보