미리 할당된 행 번호를 사용하여 특정 행을 쉽게 조작할 수 있는 방법이 있는지 궁금합니다.
파일의 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'