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