두 문자열 사이의 공백을 제거하려고하는데 다음과 같습니다.
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