두 패턴 사이에 문자열을 삽입


2

다음과 같은 이름으로 파일을 변경하고 싶습니다.

d1-a2_A1_B1.txt
abcd_A90_B2.txt

_FOO첫 번째 _A[0-9]\+와 사이 에 삽입하려는 _B[0-9]파일 이름이

d1-a2_A1_FOO_B1.txt
abcd_A90_FOO_B2.txt

그러나 내 정규 표현식이 작동하지 않습니다.

for f in $(ls); do mv $f \`echo $f | sed -e s/\(.*_A[0-9]\+\)\(_B[0-9].*\)/$1_FOO$2/\`; done

단일 문자열로 시도했습니다.

echo abcd_A90_B2.txt | sed -e s/\(.*_A[0-9]\+\)\(_B[0-9].*\)/$1_FOO$2/

확인 : 이것은 효과가있었습니다.

echo abcd_A90_B2.txt | sed -e 's/\(_A[0-9]\+\)\(_B[0-9]\)/\1_FOO\2/'

더 나은 형식으로 게시가 크게 향상되었습니다. 형식 지정 방법에 대한 도움말 페이지는 다음과 같습니다 . 직접 수정했지만 보류중인 다른 수정 사항이 있으므로 수정할 수 없습니다.
Tom Zych

답변:


0
  • -r옵션을 추가하십시오 sed(확장 정규 표현식을 사용하려면 일반적으로 이해하지 못합니다 +).
  • 당신 넣어 sed따옴표 (바람직하게는 작은 따옴표)로 스크립트를.
  • 변경 $1$2귀하의 스크립트 \1\2:

    sed -re ' s /(._ A [0-9] +) (_ B [0-9].) / \ 1_FOO \ 2 / '

또한,

  • 명확하게하기 위해, 당신은 변경할 수 있습니다 `…`$(…)- 볼 , , 그리고 - 즉, 처리 echo | sed는 처리 같은 방법으로 ls.
  • for f in *(대신 for f in $(ls)) 말하는 것이 좋습니다 .
  • echo "$f"타당한 이유가없는 한 쉘 변수 참조 (예 :)를 인용해야하며 수행중인 작업을 확실히 알고 있어야합니다.

시도했지만 작동하지 않았습니다 : echo abcd_A90_B2.txt | abcd_A90_B2.txt를 변경하지 않은 sed -e 's /(._ A [0-9] +) (_ B [0-9].) / $ 1_FOO $ 2 /'
user2783615 5

좋아, 나는 대답을 수정했다.
Scott

0

다음을 사용하여 sed 및 기타 문자열 조작을 피할 수 있습니다 mmv.

$ mmv -m -n  '*_A*_B*.txt' '#1_A#2_FOO_B#3.txt'
abcd_A90_B2.txt -> abcd_A90_FOO_B2.txt
d1-a2_A1_B1.txt -> d1-a2_A1_FOO_B1.txt

모든 파일이 원하는대로 일치하고 이름이 바뀌 었음을 확인한 후 파일을 그대로 두거나 파일 이름을 -n바꾸어 -v파일 이름을 바꾸십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.