Sed는 패턴을 명령으로 대체합니다.

Sed는 패턴을 명령으로 대체합니다.

제안이 문제.

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로 파이프될 수는 없는 것 같습니다 .sedgrep

이것이 어느 정도 가능합니까?

답변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

관련 정보