주어진 줄 번호에서 sed 작업을 수행합니다.

주어진 줄 번호에서 sed 작업을 수행합니다.

미리 할당된 행 번호를 사용하여 특정 행을 쉽게 조작할 수 있는 방법이 있는지 궁금합니다.

파일의 1, 7, 14, 16행을 출력하고 싶다고 가정하면 간단히 다음과 같이 할 수 있습니다.

sed -n '1p;7p;14p;16p' input_file

그러나 작업이 단순한 인쇄 이상의 작업인 경우에는 더 복잡해지며 동일한 긴 명령을 4번 작성하고 싶지 않습니다(예, 동일한 bash 변수를 4번 교체하여 이 긴 sed 명령을 구성할 수 있다는 것을 알고 있지만 이것은 충분히 이상적이지 않습니다...), 즉

sed -n '1{long_command};7{long_command};14{long_command};16{long_command}' input_file

내 파일의 특정 줄을 작업할 수 있는 방법이 있나요? 비슷한 내용을 기대했는데,

sed -n '1,7,14,16p'

이것은 확실히 현재 형태로는 작동하지 않습니다.

어떤 도움이라도 대단히 감사하겠습니다. "아니요, 그건 불가능합니다." 설명이 있으면 대답도 받아들일 수 있습니다.

답변1

브랜치를 사용할 수 있습니다.

sed '
  1b1
  7b1
  14b1
  16b1

  # for the rest to be left alone, branch off (or delete them with "d"):
  b

  :1
  long_command'

20,25b1(일부 행 범위를 추가 하거나 /re/b1일치하는 행을 포함 할 수도 있습니다 re.)

또는 다음을 사용할 수 있습니다 awk.

awk 'NR == 1 || NR == 7 || ... {stuff}'

또는 해시를 사용하십시오.

awk -v l=1,7,14,16 '
  BEGIN{split(l, a, ","); for (i in a) lines[a[i]]}

  NR in lines {stuff}'

(또는 BEGIN{lines[1]lines[7]lines[14]lines[16]}너무 많지 않은 경우)

답변2

선택 항목을 반전하고 삭제하면 됩니다.

sed '2,6d;8,13d;15d;17,$d;long_command'

답변3

첫 번째 변형:

다음 트릭을 사용할 수 있습니다.

sed -nf <(printf '%dp\n' 1 7 14 16)

-에프 스크립트 파일- 실행할 명령어에 스크립트 파일의 내용을 추가합니다.

시험

seq 1 20 | sed -nf <(printf '%dp\n' 1 7 14 16)

산출

1
7
14
16

두 번째 변형:

처음에는 보조 파일을 sed사용하여 파일에서 필요한 줄만 필터링한 다음 sed긴 명령을 사용하여 해당 줄을 기본 파일로 파이프합니다.

sed -n '1p; 7p; 14p; 16p' input.txt | sed 'long command'

관련 정보