sed를 사용하여 문자열에서 문자 제거

sed를 사용하여 문자열에서 문자 제거

sed문자열 끝에서 11개의 숫자를 제거하는 프로그램을 작성하려고 합니다 . 이건 내 코드야...

fname="1a.out12345678901"

fname=$(echo "$fname"|sed 's/[0-9]{11}//')

그러나 이것은 다음을 사용하여 문자열 끝에서 어떻게 삭제합니까 ? fname로만 설정됩니다 .1a.out12345678901sed12345678901

답변1

Bash는 외부 프로세스를 호출하지 않고도 작업을 수행할 수 있습니다.

11자리 숫자로 끝나면 fname해당 숫자가 제거됩니다.

[[ $fname =~ (.*)[0-9]{11}$ ]] && fname=${BASH_REMATCH[1]}

노트:

  1. 이 방법은 서브쉘이나 외부 프로세스를 생성할 필요가 없으므로 속도가 더 빠릅니다. 이 작업이 루프에서 수행되는 경우 속도가 중요할 수 있습니다.

  2. $(...)원하지 않는 부작용이 있는 명령 대체 . 예를 들어, 쉘은 명령 대체에서 후행 개행 문자를 제거합니다.

  3. 이 접근 방식은 POSIX가 아닙니다. 배쉬가 필요합니다.

다음은 마지막 11자리 숫자를 제거하는 방법을 보여줍니다.

$ fname="1a.out12345678901"; [[ $fname =~ (.*)[0-9]{11}$ ]] && fname=${BASH_REMATCH[1]}; echo "fname=$fname"
fname=1a.out

fname이 11자리 이상으로 끝나면 마지막 11자리만 제거됩니다.

$ fname="1a.out012345678901"; [[ $fname =~ (.*)[0-9]{11}$ ]] && fname=${BASH_REMATCH[1]}; echo "fname=$fname"
fname=1a.out0

fname이 11자리 미만으로 끝나면 숫자가 제거되지 않습니다.

$ fname="1a.out1234567890"; [[ $fname =~ (.*)[0-9]{11}$ ]] && fname=${BASH_REMATCH[1]}; echo "fname=$fname"
fname=1a.out1234567890

답변2

무엇:

  1. 문자열 끝에 앵커를 사용하지 않으므로 $다른 곳에서 문자가 제거될 수 있습니다.
  2. {이는 ERE 모드에서 사용하는 것이 지원되는 경우에만 구문상 의미가 있습니다 . 그렇지 않으면 다음 과 sed -r같이 해야 합니다.\{\}
  3. [0-9]로캘에 따른 의미가 있으므로 원하는 동작을 보장하려면 기대와 일치하는 로캘을 설정해야 합니다(이 경우 C)

종합해보면:

$ echo 1a.out12345678901 | LC_ALL=C sed 's/[0-9]\{11\}$//'
1a.out

답변3

이를 수행하는 몇 가지 간단한 방법이 있습니다. head, tail 또는 cut을 사용할 수 있으며 sed 또는 정규 표현식은 필요하지 않습니다.

헤더를 사용하여:

fname="1a.out12345678901"
fname=$(echo "$fname"|head -c -12)

head -c -N, 마지막 N-1 문자를 잘라냅니다. 꼬리도 그 일을 할 수 있습니다.

컷을 사용하여:

fname="1a.out12345678901"
fname=$(echo "$fname"|rev |cut -c 12-|rev)

rev는 문자열을 반전시킵니다

cut -c 12- 는 12번째 문자부터 처음 11자를 자르는 것을 의미합니다.

관련 정보