sed 복잡한 스크립트

sed 복잡한 스크립트

나는 이해하려고 노력한다이것은 훌륭한 답변입니다의 사용법을 설명합니다 sed.

몇 가지 테스트 데이터를 구성했습니다.

printf "Line #%2d\n" {1..7} >file

그런 다음 실행

sed -e \$$'{w/dev/stdout\n;d}' -i~ file

이 명령을 알아 내려고 노력 중입니다 sed. 지금까지 내가 생각한 것은 다음과 같습니다.

  1. -e

-e script, --expression=script 실행할 명령에 스크립트를 추가합니다.

  1. 이 답변에 대해 설명하세요 /dev/stdout.

  2. \n개행 문자를 나타냅니다.

  3. -i~

-i[접미사], --in-place[=접미사]

파일을 제자리에서 편집합니다(또는 확장자가 제공된 경우 백업).

나는 아직도 그것을 이해할 수 없다.

답변1

첫 번째 명령은 7줄의 텍스트가 포함된 파일을 만듭니다. 이 데이터가 사용됩니다그래서 대답은sed이 명령 의 효과를 설명하기 위해 file.

$'...'sed("C 문자열")을 이해하고 GNU (이해 d}됨) 를 사용하는 쉘이 주어지면 d;}두 번째 명령은 테스트 데이터 파일의 마지막 줄을 표준 출력으로 반환하고 파일에서 제거하여 원시 데이터를 백업합니다( 이 file~원시 데이터를 백업하는 작업입니다 ).file~-i~

SO 답변에서 sed편집 스크립트는 명령줄에 다음과 같이 작성됩니다.

\$$'{w/dev/stdout\n;d}'

이것은 리터럴이고 $그 뒤에 "C 문자열"이 옵니다 $'{w/dev/stdout\n;d}'. C 문자열 따옴표는 \n리터럴 줄 바꿈으로 확장되도록 되어 있습니다.

${w/dev/stdout
;d}

...그건 엉성한 스크립트 sed방법 이군요

$ {
    w /dev/stdout
    d
}

sed편집 스크립트는 변경되지 않은 마지막 줄을 제외한 모든 항목을 출력으로 전달합니다( 옵션 file으로 인해 -i파일로 이동됩니다 ).

마지막 줄은 /dev/stdout기본 출력(이 경우)에 쓰는 대신 이 명령을 사용하여 작성된 다음 삭제됩니다.filewd

그 결과 마지막 줄을 제외한 모든 줄이 유지되고(다시 기록됨) file마지막 줄은 표준 출력(터미널에 연결됨)으로 생성됩니다.

답변2

귀하가 요청한 질문에 대한 훌륭한 답변을 얻었지만 참고로 "sed를 사용하여 파일에 명령을 구현하는 방법"에 대한 가장 좋은 대답은 pop"하지 마십시오"입니다. 명확성이 부족하여 빨리 끝나지 않는다면 이 질문에 대한 답변이 이루어졌으면 좋겠습니다.

현재 사용 중인 GNU sed 대신 GNU awk를 사용하는 다음은 모든 셸에서 작동하며 이해하기 더 쉬울 것입니다.

$ awk -i inplace 'NR>1{print prev} {prev=$0} END{if (NR) print prev}' file
Line # 7

$ cat file
Line # 1
Line # 2
Line # 3
Line # 4
Line # 5
Line # 6

바라보다https://www.gnu.org/software/gawk/manual/gawk.html#Extension-Sample-InplaceGNU awk를 사용한 "내부" 편집에 대한 추가 정보.

관련 정보