역참조와 함께 sed 사용

역참조와 함께 sed 사용

두 문자열 사이의 공백을 제거하려고하는데 다음과 같습니다.

312.2 MB
123.34 KB
487.1 GB

나는 그것들을 다음과 같이 바꾸고 싶습니다 :

312.2MB
123.34KB
487.1GB

나는 노력해 왔으며 다음을 얻을 수 있습니다.

echo "312.2 MB" | sed s/[0-9][[:space:]][GMK]//g
312.B

하지만 다음을 사용하여 역참조를 만들려고 할 때 sed:

echo "312.2 MB" | sed s/\([0-9]\)[[:space:]]\([GMK]\)/\1/g
312.2 MB

내 생각에는 일치 항목이 하나만 있고 역참조가 완전한 일치 항목인 것 같습니다. 그러나 다음과 같습니다.

echo "312.2 MB" | sed s/\([0-9]\)[[:space:]]\([GMK]\)/TRY/g
312.2 MB

()그래서 제가 다음을 사용하여 캐릭터를 캡처할 때

정규식이 완전히 정확하지 않을 수도 있지만 그 이유는 모르겠습니다.

답변1

문제는 참조에 있습니다.

명령을 인용하지 않았기 때문에 sed대괄호는 \(...\)에 전달되기 전에 쉘에 의해 해석됩니다 sed.

따라서 sed이스케이프된 대괄호가 아닌 리터럴 대괄호로 처리되며 역참조에 영향을 주지 않습니다.

다음을 수행해야 합니다.

echo "312.2 MB" | sed 's/\([0-9]\)[[:space:]]\([GMK]\)/\1\2/g'

역참조에 영향을 미치고 원하는 것을 얻으십시오.

또는 더 간단하게:

echo "312.2 MB" | sed 's/ //'

답변2

당신은 당신의 표현을 하나도 인용하지 않았습니다 sed. 그것이 범인입니다. 예를 들어 따옴표를 사용하면 sed ' '간단히 tr다음과 같은 표현을 통해 얻을 수 있습니다.

tr -d '[:space:]' <<< "312.2 MB"
312.2MB

tr -d ' ' <<< "123.34 KB"
123.34KB

tr -d '[:blank:]' <<< "487.1 GB"
487.1GB

고집하면 sed이렇게 할 수 있다.

sed 's/ //g' 
sed 's/[[:blank:]]//g' 
sed 's/[[:space:]]//g' 

답변3

사용 bash:

$ txt="32.2 MB"
$ echo ${txt// /}
32.2MB

관련 정보