수있는 방법이 있나요 sed
에 파이프를 만들고, 다른 프로그램으로 캡처 그룹 \1
정규 표현식의 RHS에 그 프로그램의 출력에 동일을?
예를 들어, 달리기
sed 's/lorem ipsum \(foobar\)/\1/g' file.txt
"lorem ipsum foobar"를 "lorem ipsum faabar"로 대체하기 위해 " faabar" tr 'o' 'a'
가되도록 다른 프로그램 (예 \1
:) 을 통해 "foobar"를 파이프 sed
할까요?
이것은 단순한 예입니다. 를 사용하지 않고도 "foobar"를 "faabar"로 변환 할 수 있다는 것을 알고 tr
있습니다.
귀하 sed
가 GNU sed
. 사용할 수 있습니다 s/…/…/e
.
e
이 명령을 사용하면 쉘 명령의 입력을 패턴 공간으로 파이프 할 수 있습니다. 대체가 이루어지면 패턴 공간에서 발견 된 명령이 실행되고 패턴 공간이 출력으로 대체됩니다. 후행 개행은 억제됩니다. 실행할 명령에 NUL 문자가 포함되어 있으면 결과가 정의되지 않습니다. 이것은 GNU sed 확장입니다.
( 출처 )
그것은 실행 주 전체 패턴 공간과 대체 전체 패턴 공간. 일반적으로 전체 라인입니다. 조각을 조작하려고합니다 : foobar
. 패턴 공간을 조작하는 방법을 찾 foobar
거나 foobar
라인 처리가 끝날 때 이전 또는 이후 에 아무것도 누락하지 않고 잠시 동안 만 유지되도록 합니다. 또는 실제로 쉘에서 실행될 전체 라인을 준비합니다. 전자는 쉽게 할 수 없지만 후자는 할 수 있다고 생각합니다.
다음을 수행해야합니다.
'
에 '"'"'
코드를 주입 나중에 불가능하므로.'"$(printf … | external_command …)"'
올바른 위치에 주사 하십시오.printf '%s' '
및에 전체 줄을 포함 '
합니다.각 단계에서 이전 단계의 가능한 결과를 고려해야합니다. 당신의 패턴이 아닌 경우 예는 foobar
있지만 foo'bar
, 그 첫 번째 단계 후에는 위해 노력해야한다 foo'"'"'bar
(필요한 경우 적절한 이스케이프와 함께).
올바르게 작성하면 절차가 모든 줄에 적용될 수 있습니다. 생성되는 셸 및 external_command
의 수를 줄이려면 실제로 필요한 라인에 대해서만이 작업을 수행 할 수 있습니다.
예제를 해결하려면 :
sed "/lorem ipsum foobar/ {
s#'#'\"'\"'#g
s#\(lorem ipsum \)\(foobar\)#\1'\"\$(printf '%s' '\2' | tr 'o' 'a')\"'#g
s#.*#printf '%s' '\0'#e
}"
전체 스크립트는 큰 따옴표로 묶여 있습니다. 이 때문에 "
및 같은 문자 $
가 이스케이프됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다