sed 라인 삭제에서 변수를 사용하는 방법

sed 라인 삭제에서 변수를 사용하는 방법

값이 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와 반대로 히스토리 확장 zshcsh작은따옴표 안에서 발생하지 않으므로 sed '0,6!d'문제가 없습니다. 그러나 sed "0,6!d"아직은 아냐. 대화형 bash셸 에서 !d를 포함하도록 확장합니다 d.

!다음을 수행하여 특별한 의미를 제거 할 수 있습니다 .

sed "0,$line_number"'!d'

최신 쉘에는 더 나은 대화형 기능이 있기 때문에 개인적으로 기록 확장 기능을 비활성화합니다. 저는 zshwith에서 비활성화했고, 여러분은 set +o banghistwith에서 비활성화할 수 있습니다(사실 1997년에 3.1.2와의 호환성을 위해 별칭으로 추가되었기 때문에 with에서도 사용할 수 있습니다). 에서는 를 사용하여 기록 확장을 비활성화할 수 있습니다. 실제로 동일한 방법이 및 에도 적용됩니다.bashset +o histexpandzshhistexpandbanghistbashset +o histexpandzsh(t)cshset histcharshistchars=bashzsh

0주소는 GNU sed확장입니다. 이식 가능한 경우 다음을 사용할 수 있습니다 head(더 효율적이기도 함).

head -n "$line_number"

휴대용 의 경우 sed다음을 사용할 수 있습니다.

sed "${line_number}q"

또한 계속해서 읽고 다른 모든 줄을 삭제하는 것보다 줄 1 이후 읽기를 중지하기 때문에 더 효율적입니다 .sed$line_number

관련 정보