Sed + 텍스트 파일의 행을 표시하기 위해 sed 명령에서 매개변수를 설정하는 방법

Sed + 텍스트 파일의 행을 표시하기 위해 sed 명령에서 매개변수를 설정하는 방법

파일에서 줄을 인쇄하는 다음 방법을 찾았습니다.

이 예에서는 호스트 파일의 첫 번째 줄을 인쇄하려고 합니다.

sed -n '1,1p'  /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

하지만 sed 명령의 매개변수를 사용하여 동일한 작업을 수행하는 방법

예를 들어

Line_number=1
sed -n ' $Line_number,$Line_numberp'  /etc/hosts
 sed: -e expression #1, char 4: extra characters after command

내 sed 구문에 어떤 문제가 있나요?

답변1

변수를 확장하려면 쉘에서 ' 대신에 "를 사용하십시오.

예:

victor@pyfg:~$ line_number=2
victor@pyfg:~$ sed -n "${line_number},${line_number}p" /etc/hosts
1.2.3.4 row-2

한 줄만 인쇄하므로 다음과 같이 인쇄할 수도 있습니다.

victor@pyfg:~$ sed -n "${line_number}p" /etc/hosts
1.2.3.4 row-2

답변2

재미를 위해 awk 솔루션 :

awk -v line=2 'FNR==line' /etc/hosts

답변3

q귀하의 예에서는 원하는 데이터가 인쇄되었음을 확인한 후 sed uit를 사용하여 파일을 입력하는 것이 좋습니다. 예를 들어:

sed 1q <INPUT

그러면 자동으로 첫 번째 줄이 인쇄되고 프로세스가 완전히 종료됩니다. 다음과 같이 할 수도 있습니다.

head -n1 <INPUT

...동일한 효과를 얻으려면.

sed그러나 해석될 수도 있으며 두 유형의 조합 address,ranges이 될 수도 있습니다 . /regex/,/addresses/예를 들어:

sed '9q;/LINE[0-9]/,/^$/!d' <<FILE
$(printf 'LINE %s\nLINE%s\nLINE %s\\nNOT LINE %s\n\n' $(seq 32))
FILE

###OUTPUT###

LINE2
LINE 3\nNOT LINE 4

LINE6
LINE 7\nNOT LINE 8

LINE 9

위의 예에서는 문자열이나 그 바로 뒤에 오는 숫자가 포함된 줄과 문자가 전혀 포함되지 않은 줄 또는 빈 줄 사이에 sed d있지 않은 모든 줄이 삭제됩니다 . !따라서 라인 1과 5 - 또는가 출력에서 ​​제거됩니다. 대신 9로 표시되기 때문에 해당 시점에서 스크립트 처리를 중지합니다. 이는 필터가 스크립트를 제거하기 전에 발생하므로 인쇄됩니다.LINE[0-9]/^$/LINE [15]LINE 9q

다른 답변에서 제안한 것처럼 변수 매개변수를 처리하는 것은 쉘이 매개변수를 확장하도록 허용하는 것만큼 간단합니다. 따라서 이를 수행하려면 "$parameter"를 사용해야 합니다. 잘못된 입력은 잘못된 입력으로 처리된다는 점을 기억하는 것이 중요합니다. 예를 들어, 같은 이유로:

echo "///" | sed 's////g'     
sed: -e expression #1, char 5: unknown option to `s'

...도 아니다:

v=/ ;echo "///" | sed "s/$v//g"                                 :(
sed: -e expression #1, char 5: unknown option to `s'

각 변수의 값은 유효한 sed스크립트여야 하며 구분 기호를 포함할 수 없습니다.

관련 정보