답변:
sed에서 대체 명령은 일반적으로로 작성됩니다 s/pattern/replacement/options
. 그러나 사용할 필요는 없습니다. /
편리한 경우 다른 문자를 사용할 수 있으므로 s@pattern@replacement@options
또는 일 수 있습니다 s:foo:bar:g
. s@+@ @g
마치 공백으로 s/+/ /g
대체 +
하십시오. 비슷하게 s@%@\\x@g
모두를 %
로 바꿉니다 \x
(sed에서 단일 백 슬래시는 이스케이프 문자이므로 실제 백 슬래시를 얻으려면 두 개가 필요합니다).
그러면 foo+%2Fbar
다음 과 같은 문자열이 됩니다 foo \x2Fbar
. (16 진수 값이 2F 인 ASCII 문자) printf "%b"
와 같이 백 슬래시 이스케이프 처리 된 시퀀스를 확장하여 최종적으로 제공합니다 .\x2F
/
foo /bar
URL에서 +
es 및 %
시퀀스 를 디코딩 하도록 요청 하는 sed
명령 은 명령 이 아니라 입력을 처리 한 파이프 라인 으로 sed
, 이후 xargs
처리 를 위해 파이프합니다 . 먼저 다음 sed
명령을 살펴 보겠습니다 .
sed 's@+@ @g;s@%@\\x@g'
검색 패턴이나 대체 텍스트에 나타나지 않기 때문에 복잡하지 않고 여기서 쉽게 수행 할 수있는 구분 기호 가 /
아닌 @
구분 기호로 보는 것이 더 익숙 할 수 있습니다 /
. 이 명령은 다음과 같습니다.
sed 's/+/ /g;s/%/\\x/g'
처럼 /
, @
에 대한 완벽한 문장 부호 문자입니다 sed
.
각 입력 줄에서 :
s@+@ @g
( s/+/ /g
)는 ( s
)를 +
공백으로 대체 합니다. 이것은 첫 번째 +
줄 g
뿐만 아니라 줄 ( )의 모든 es에 영향을줍니다 .
;
작업을 종료하고 ( "명령") 동일한 "스크립트"에서 다른 작업을 지정할 수 있습니다.
s@%@\\x@g
( s/%/\\x/g
) 대체 ( s
)의 발생 %
과 함께 \x
. 이전과 마찬가지로 각 행의 첫 번째 행 ( g
)이 아닌 모든 행에서 작동 합니다.
에서 \\x
(가) \\
한 표현 \
때문에 \
특별한 의미가 있습니다 sed
. 그것의 특별한 의미는 실제로 다른 의미의 다른 캐릭터의 특별한 의미를 빼앗아가는 데 사용하는 캐릭터입니다. 따라서로 탈출해야합니다 \\
.
이제 xargs
목적을 실행 하는 명령을 살펴 보겠습니다 printf
.
xargs
명령 행을 구성합니다. 당신이 실행하는 경우 경우, 하나 개 이상의 단어이며, 실행 추가로 명령 줄 인수가 입력에서 읽습니다. 이 경우에 대한 입력 은 파이프 ( )로 인해의 출력입니다 . 일반적으로 입력의 공백을 해석하여 텍스트 전후의 텍스트가 별도의 인수를 구성 함을 의미하지만 대신 널 문자가 발생할 때 인수를 분할 합니다.xargs command...
command...
xargs
command...
xargs
sed
|
xargs
-0
명령의 용도에 널 문자가 나타나지 않습니다 및 xargs
실행 printf %b
한 추가 명령 줄 인수의 출력과 sed
명령. 따라서 일반적으로 동일하지는 않지만이 경우 전체 파이프 라인이 대신 다음과 같은 명령 대체 를 사용하여 다음과 같이 작성되었을 수 있습니다 xargs
.
printf '%b\n' "$(sed 's/+/ /g;s/%/\\x/g')"
무엇에 관해서는 printf
, 여기에서해야 할 것입니다 muru 말한대로%b
형식 지정자를 소모하고 (같은 인수를 출력한다 %s
)하지만 백 슬래시 이스케이프의 원인 - 종류의 sed
명령 파이프의 왼쪽에 생성하기 위해 작성되었습니다 - 수 번역 그들이 나타내는 캐릭터로 .
해당 명령을 실행하고 http://foldoc.org/debugging%20by%20printf
입력으로 전달한다고 가정하십시오 . 시퀀스가 공백으로 변환 http://foldoc.org/debugging by printf
되기 때문에 출력으로 얻 %20
습니다.
즉의 아름다움 sed
은 명령 후 (예 : ... 자체의 패러다임을 적용, s
또는 tr
다음 문자가 구분 간주됩니다, 또는 아무것도).
쉘과 명령 자체의 간섭을 피하고 내용을 읽을 수 있도록 현명하게 선택해야하지만 다음과 같이 끔찍한 것을 쓰는 것이 완벽하게 유효합니다.
echo 'arrival' | sed srarbrg
... brrivbl
결과적으로 얻을 수 있습니다. 다음과 같이 재미있게 만들 수 있습니다.
echo 'arrival' | sed s\fa\fb\fg # \f is form feed, chr(12)
일반적으로 슬래시를 구분 기호로 사용하지만 식에 구분 기호가 포함되어 있으면 의도를 쉽게 파악할 수 있습니다. 분리 문자는 ASCII8 범위 ( £
오류 를 유발하는 것과 같은 멀티 바이트 분리 문자)의 모든 것이 될 수 있습니다 .
목표는 더 비밀스럽지 않고 일을 더 쉽게 만드는 것입니다.
sed "snack is an apple or something" <<< "I sed your snack is an apple or something"
sed
두뇌 티저로 명령을 사용할 수 있습니다 . 얼마나 괴짜입니까?