그것을 얻고 싶지만 >chr05_pilon_pilon.12.1
불행히도 다음 명령은 삭제되지 않습니다t
echo '>chr05_pilon_pilon.12.t1' | sed '/^\\>chr[0-9][0-9]_pilon_pilon/ s/\(.*\)t/\1/g'
>chr05_pilon_pilon.12.t1
내가 놓친 게 무엇입니까?
답변1
정규식을 사용할 때마다 "적을수록 좋다"는 점을 기억해야 합니다. 내 말은 항상 사용하려고 노력해야한다는 것입니다가장 단순한그리고가장 짧은데이터와 일치하는 패턴입니다. 모든 것을 맞추려고 하지 말고 꼭 필요한 부분만 선택하세요.
이 경우 마지막 항목 이후에 마지막 항목을 >chr05_pilon_pilon.12.t1
삭제하기만 하면 됩니다 . 따라서 처음부터 일치시키려고 하지 마십시오. 그것에 대해 신경쓰지 마십시오. 그렇게 하면 정규 표현식이 더 복잡해지고 오류가 발생하기 쉬워질 뿐입니다. 실제 요구 사항에 따른 몇 가지 대안은 다음과 같습니다.t
.
.
마지막 줄부터 시작하여 숫자가 아닌 문자를 모두 제거합니다>
.$ echo '>chr05_pilon_pilon.12.t1' | sed -E 's/^(>.*)\.[^0-9]*/\1./' >chr05_pilon_pilon.12.1
t
다음으로 시작하는 마지막 줄을 삭제합니다>
.$ echo '>chr05_pilon_pilon.12.t1' | sed -E 's/^(>.*)t/\1/' >chr05_pilon_pilon.12.1
위와 동일하지만
t
바로 다음 경우에만 해당.
$ echo '>chr05_pilon_pilon.12.t1' | sed -E 's/^(>.*\.)t/\1/' >chr05_pilon_pilon.12.1
t
a 뒤의 마지막 것을 제거하십시오 . 단.
, then으로 시작하고 그 뒤에 두 숫자의 합이 나오는 줄에서만 제거하십시오.>
chr
pilon_pilon
$ echo '>chr05_pilon_pilon.12.t1' | sed -E 's/^(>chr[0-9][0-9]_pilon_pilon.*\.)t/\1/' >chr05_pilon_pilon.12.1
X
마지막으로, ,Y
및M
또는 염색체 도 있다고 가정하면MT
위의 내용을 확장하여 해당 염색체와 일치시킬 수 있습니다.$ printf '>chrX_pilon_pilon.12.t1\n>chr05_pilon_pilon.12.t1\n>chrMT_pilon_pilon.12.t1\n' | sed -E 's/^(>chr([0-9XYM]{1,2}|MT)_pilon_pilon.*\.)t/\1/' >chrX_pilon_pilon.12.1 >chr05_pilon_pilon.12.1 >chrMT_pilon_pilon.12.1
답변2
\
귀하의 패턴은 줄의 시작 부분에서 a 를 일치시키려고 시도 하지만 다음을 수행하지 않습니다.
$ echo '>chr05_pilon_pilon.12.t1' | sed '/^\\>chr[0-9][0-9]_pilon_pilon/ s/\(.*\)t/\1/'
>chr05_pilon_pilon.12.t1
\
줄의 시작 부분을 일치시키려고 하지 마세요 :
$ echo '>chr05_pilon_pilon.12.t1' | sed '/^>chr[0-9][0-9]_pilon_pilon/ s/\(.*\)t/\1/'
>chr05_pilon_pilon.12.1
또한 X, Y 및 M 염색체를 허용할 수도 있습니다(게놈 어셈블리에 포함된 내용에 따라 다름).
echo '>chr05_pilon_pilon.12.t1' | sed -E '/^>chr([0-9][0-9]|[XYM])_pilon_pilon/ s/(.*)t/\1/'
또한 이는 /g
필수 사항이 아닙니다.
답변3
다음 명령은 원하는 출력을 얻는 데 도움이 됩니다.
#!/bin/bash
echo '>chr05_pilon_pilon.12.t1' | sed 's/.t/./'
산출:
>chr05_pilon_pilon.12.1