
sed
문자열 끝에서 11개의 숫자를 제거하는 프로그램을 작성하려고 합니다 . 이건 내 코드야...
fname="1a.out12345678901"
fname=$(echo "$fname"|sed 's/[0-9]{11}//')
그러나 이것은 다음을 사용하여 문자열 끝에서 어떻게 삭제합니까 ? fname
로만 설정됩니다 .1a.out12345678901
sed
12345678901
답변1
Bash는 외부 프로세스를 호출하지 않고도 작업을 수행할 수 있습니다.
11자리 숫자로 끝나면 fname
해당 숫자가 제거됩니다.
[[ $fname =~ (.*)[0-9]{11}$ ]] && fname=${BASH_REMATCH[1]}
노트:
이 방법은 서브쉘이나 외부 프로세스를 생성할 필요가 없으므로 속도가 더 빠릅니다. 이 작업이 루프에서 수행되는 경우 속도가 중요할 수 있습니다.
$(...)
원하지 않는 부작용이 있는 명령 대체 . 예를 들어, 쉘은 명령 대체에서 후행 개행 문자를 제거합니다.이 접근 방식은 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
무엇:
- 문자열 끝에 앵커를 사용하지 않으므로
$
다른 곳에서 문자가 제거될 수 있습니다. {
이는 ERE 모드에서 사용하는 것이 지원되는 경우에만 구문상 의미가 있습니다 . 그렇지 않으면 다음 과sed -r
같이 해야 합니다.\{
\}
[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자를 자르는 것을 의미합니다.