제안이 문제.
string <number with commas>
을 교체하고 싶다고 가정해 보겠습니다 .<number>
something, "10,000", something
숫자는 1,000
, 10,000
...등이 될 수 있습니다.
다음 명령을 사용할 수 있는지 확인하려고 합니다.
echo 'something, "10,000", something' | sed "s/\(\".*\"\)/$(echo \\1 | sed 's/,//')/"
작동하지 않습니다. 아무 일도 일어나지 않습니다.
내 문제를 유발하는 것은 내가 그냥 사용하면echo
echo 'something, "10,000", something' | sed "s/\(\".*\"\)/$(echo \\1)/"
매개변수는 잘 읽혀지지만 (또는 ) \\1
로 파이프될 수는 없는 것 같습니다 .sed
grep
이것이 어느 정도 가능합니까?
답변1
명령이 실행되기 전에 표현식의 일부로 명령 대체가 확장 sed
됩니다 .sed
이는 쉘이 명령을 실행하려고 함을 의미합니다.
sed "s/\(\".*\"\)/$(echo \\1 | sed 's/,//')/"
첫 번째 실행
echo \\1 | sed 's/,//'
이 출력은 \1
출력 문자열에 쉼표가 없기 때문에 발생합니다 echo
.
그런 다음 쉘은 이 문자열을 명령 대체 위치에 삽입하여 다음을 생성합니다.
sed "s/\(\".*\"\)/\1/"
이는 셸에서 추적이 활성화된 상태로 파이프라인을 실행하는 경우에도 분명합니다.
$ set -x
$ echo 'something, "10,000", something' | sed "s/\(\".*\"\)/$(echo \\1 | sed 's/,//')/"
+ echo 'something, "10,000", something'
+ echo '\1'
+ sed s/,//
+ sed 's/\(".*"\)/\1/'
something, "10,000", something
두 번째 파이프라인에서도 동일한 일이 발생합니다(실행 제외 sed 's/,//'
).
$ set -x
$ echo 'something, "10,000", something' | sed "s/\(\".*\"\)/$(echo \\1)/"
+ echo 'something, "10,000", something'
+ echo '\1'
+ sed 's/\(".*"\)/\1/'
something, "10,000", something
결론은: 그렇다아니요sed
명령 대체를 사용하여 정규식과 일치하는 하위 문자열을 처리하고 내부에서 다른 쉘 명령을 호출할 수 있습니다 . 명령 대체는 호출 전에 처리되기 때문입니다 sed
( sed
편집 스크립트가 호출 전에 구문 분석됨 sed
).
sed
게다가 해당 언어는 다른 편집/처리 언어처럼 다른 명령을 호출하는 메커니즘을 제공하지 않습니다(예: 기본 명령 r
과 편집기의 w
명령이 ed
이를 허용합니다 awk
).
답변2
sed 's/\([0-9]\),\([0-9]\)/\1\2/g'
이 방법은 두 쉼표 사이에 최소한 두 개의 숫자가 있는 경우에만 작동합니다.
123,456,789 -> 123456789
12,34,56,78 -> 12345678
but
1,2,3,4,5,6 -> 12,34,56