값이 6인 변수가 있습니다.
$ echo $line_number
6
sed를 사용하여 0 - 6을 제외한 모든 줄을 삭제하면 예상대로 작동합니다.
$ sed "0,6!d" ~/myfile
숫자 6을 변수로 바꾸려고 하면 오류가 발생합니다.
$ sed "0,$line_number!d" ~/myfile
bash: !d": event not found
답변1
여기서 문제는 !
대화식 bash
인 경우 큰따옴표 내에서도 트리거되는 문자입니다.역사적 확장.
이 기능은 csh(실제로는 더 나쁨)에서 제공되며 bash 및 zsh에서도 찾을 수 있지만 그 외에는 표준 sh
기능이 아닙니다.
bash
와 반대로 히스토리 확장 zsh
은 csh
작은따옴표 안에서 발생하지 않으므로 sed '0,6!d'
문제가 없습니다. 그러나 sed "0,6!d"
아직은 아냐. 대화형 bash
셸 에서 !d
를 포함하도록 확장합니다 d
.
!
다음을 수행하여 특별한 의미를 제거 할 수 있습니다 .
sed "0,$line_number"'!d'
최신 쉘에는 더 나은 대화형 기능이 있기 때문에 개인적으로 기록 확장 기능을 비활성화합니다. 저는 zsh
with에서 비활성화했고, 여러분은 set +o banghist
with에서 비활성화할 수 있습니다(사실 1997년에 3.1.2와의 호환성을 위해 별칭으로 추가되었기 때문에 with에서도 사용할 수 있습니다). 에서는 를 사용하여 기록 확장을 비활성화할 수 있습니다. 실제로 동일한 방법이 및 에도 적용됩니다.bash
set +o histexpand
zsh
histexpand
banghist
bash
set +o histexpand
zsh
(t)csh
set histchars
histchars=
bash
zsh
이 0
주소는 GNU sed
확장입니다. 이식 가능한 경우 다음을 사용할 수 있습니다 head
(더 효율적이기도 함).
head -n "$line_number"
휴대용 의 경우 sed
다음을 사용할 수 있습니다.
sed "${line_number}q"
또한 계속해서 읽고 다른 모든 줄을 삭제하는 것보다 줄 1 이후 읽기를 중지하기 때문에 더 효율적입니다 .sed
$line_number