파일에서 줄을 인쇄하는 다음 방법을 찾았습니다.
이 예에서는 호스트 파일의 첫 번째 줄을 인쇄하려고 합니다.
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 9
q
다른 답변에서 제안한 것처럼 변수 매개변수를 처리하는 것은 쉘이 매개변수를 확장하도록 허용하는 것만큼 간단합니다. 따라서 이를 수행하려면 "$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
스크립트여야 하며 구분 기호를 포함할 수 없습니다.