@ 기호가 많은이 'sed'대체 명령은 어떻게 작동합니까?


8

누구든지이 sed명령 이 어떻게 작동 하는지 설명 할 수 있습니까 ?

sed 's@+@ @g;s@%@\\x@g' | xargs -0 printf "%b"

3
이 작업을 수행하는 일반적인 방법은 슬래시를 사용하는 것이지만 검색하고 슬래시로 바꾸면 번거로울 수 있습니다. 여기에는 해당되지 않으므로 완벽하게 괜찮더라도 미래의 관리자와 혼동됩니다.
Thorbjørn Ravn Andersen 님이

2
sed이 방법 에 대해 새로운 것을 배우도록 안내합니다 ! :)
디저트

답변:


15

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


2
간단히 말해서 URL-> 파일 이름 디코더입니다.
Thorbjørn Ravn Andersen

10

URL에서 +es 및 %시퀀스 를 디코딩 하도록 요청 하는 sed명령 은 명령 이 아니라 입력을 처리 한 파이프 라인 으로 sed, 이후 xargs처리 를 위해 파이프합니다 . 먼저 다음 sed명령을 살펴 보겠습니다 .

sed 's@+@ @g;s@%@\\x@g'

검색 패턴이나 대체 텍스트에 나타나지 않기 때문에 복잡하지 않고 여기서 쉽게 수행 할 수있는 구분 기호 가 /아닌 @구분 기호로 보는 것이 더 익숙 할 수 있습니다 /. 이 명령은 다음과 같습니다.

sed 's/+/ /g;s/%/\\x/g'

처럼 /, @에 대한 완벽한 문장 부호 문자입니다 sed.

각 입력 줄에서 :

  1. s@+@ @g( s/+/ /g)는 ( s)를 +공백으로 대체 합니다. 이것은 첫 번째 +g뿐만 아니라 줄 ( )의 모든 es에 영향을줍니다 .

  2. ; 작업을 종료하고 ( "명령") 동일한 "스크립트"에서 다른 작업을 지정할 수 있습니다.

  3. s@%@\\x@g( s/%/\\x/g) 대체 ( s)의 발생 %과 함께 \x. 이전과 마찬가지로 각 행의 첫 번째 행 ( g)이 아닌 모든 행에서 작동 합니다.

    에서 \\x(가) \\한 표현 \때문에 \특별한 의미가 있습니다 sed. 그것의 특별한 의미는 실제로 다른 의미의 다른 캐릭터의 특별한 의미를 빼앗아가는 데 사용하는 캐릭터입니다. 따라서로 탈출해야합니다 \\.


이제 xargs목적을 실행 하는 명령을 살펴 보겠습니다 printf.

xargs명령 행을 구성합니다. 당신이 실행하는 경우 경우, 하나 개 이상의 단어이며, 실행 추가로 명령 줄 인수가 입력에서 읽습니다. 이 경우에 대한 입력 은 파이프 ( )로 인해의 출력입니다 . 일반적으로 입력의 공백을 해석하여 텍스트 전후의 텍스트가 별도의 인수를 구성 함을 의미하지만 대신 널 문자가 발생할 때 인수를 분할 합니다.xargs command...command...xargscommand...xargssed|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습니다.


3

즉의 아름다움 sed은 명령 후 (예 : ... 자체의 패러다임을 적용, s또는 tr다음 문자가 구분 간주됩니다, 또는 아무것도).

쉘과 명령 자체의 간섭을 피하고 내용을 읽을 수 있도록 현명하게 선택해야하지만 다음과 같이 끔찍한 것을 쓰는 것이 완벽하게 유효합니다.

echo 'arrival' | sed srarbrg

... brrivbl결과적으로 얻을 수 있습니다. 다음과 같이 재미있게 만들 수 있습니다.

echo 'arrival' | sed s\fa\fb\fg   # \f is form feed, chr(12)

일반적으로 슬래시를 구분 기호로 사용하지만 식에 구분 기호가 포함되어 있으면 의도를 쉽게 파악할 수 있습니다. 분리 문자는 ASCII8 범위 ( £오류 를 유발하는 것과 같은 멀티 바이트 분리 문자)의 모든 것이 될 수 있습니다 .

목표는 더 비밀스럽지 않고 일을 더 쉽게 만드는 것입니다.


비밀스러운 아이디어로 실행하면 유용한 sed 명령이지만 유용한 것은 없습니다 :sed "snack is an apple or something" <<< "I sed your snack is an apple or something"
wjandrea

좋은! 네, sed두뇌 티저로 명령을 사용할 수 있습니다 . 얼마나 괴짜입니까?
Marabiloso
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.