패턴에서 변수와 함께 sed 사용

패턴에서 변수와 함께 sed 사용

나는 중간에 다른 변수를 사용하여 동일한 확장자를 가진 두 개의 파일 이름을 바꾸려고 노력하고 있습니다.

문서:cKO_mESC_Rep_1_H3K27Ac.gc_corrected.bam

INBAM=$(ls *_*.gc_corrected.bam)
INPUT=$(echo $INBAM | sed 's/_*.gc_corrected.bam/_input.gc_corrected.bam/g')

echo $INPUT 
cKO_mESC_Rep_1_H3K27Ac_input.gc_corrected.bam

그러나 나는 내 출력이cKO_mESC_Rep_1_input.gc_corrected.bam

오류가 무엇인지 아는 사람이 있습니까? 많은 것을 시도했지만 올바른 키워드를 사용하여 검색하여 답변을 얻지 못할 수도 있습니다. 감사해요!

답변1

웹사이트에 오신 것을 환영합니다.

"와일드카드"(일명 "쉘 볼") 그리고일반적인 표현사용하기 전에 sed.

귀하의 의도는 .gc_corrected.bam"밑줄, 그 뒤에 임의의 수의 문자와 숫자, 그 뒤에" 패턴을 바꾸는 것 입니다 _input.gc_corrected.bam. 불행하게도 당신의 sed표현에는 두 가지 면에서 결함이 있습니다.

  • 일치 부분은 쉘의 일반적인 "와일드카드" 표기법을 사용합니다. 다만, 여기에는 sed정규식이 필요하며 , 정규식에서는*아니요"0개 이상의 문자로 구성된 문자열"을 의미하지만 "이전 문자의 0개 이상의 반복"을 의미하므로 표현식은 .gc_corrected.bam"0개 이상의 밑줄과 다음"으로 구성된 문자열을 대체합니다. 패턴은 로 대체됩니다 _input.gc_corrected.bam. 그렇기 때문에 귀하의 경우 파일 이름 접미사 앞의 마지막 밑줄을 _input.
  • 그럼에도 불구하고 실제 파일 이름에 밑줄이 여러 개 있는 경우 "임의의 문자로 구성된 문자열"과 일치하는 패턴에도 밑줄이 포함되어 일치하는 문자열의 길이에 따라 바람직하지 않은 동작이 발생할 수 있습니다. 특히 정규식은 욕심이 많아 주의 깊게 구성하지 _mESC_Rep_1_H3K27Ac않으면 _input.

귀하의 경우 올바른 정규식은 다음과 같습니다.

sed 's/_[^_]+\.gc_corrected\.bam/_input.gc_corrected.bam/g'

밑줄로 시작 _하고 그 뒤에 하나 이상의 문자가 오는 문자열을 대체합니다.밑줄이 그어져 있지 않음( [^_]+) 다음에 가 .gc_corrected.bam으로 대체됩니다 _input.gc_corrected.bam.

또한 참고하시기 바랍니다정규식에서 는 ."모든 단일 문자"(쉘 와일드카드로 표시됨 ?)를 나타내므로 리터럴과 일치시키려면 .이 문자를 이스케이프해야 합니다. 물론 교체 문자열에는 필요하지 않습니다.저것정규 표현식이 아닙니다.

관련 정보