특정행의 내용을 출력하거나 입력시키는 방법?


제목

특정행의 내용을 출력하거나 입력시키는 방법?


특정행의 내용을 출력하는 경우에 대한 설명

예를들어 13번째 줄의 내용을 (표준출력이나 파일로) 출력 합니다.

2~3줄에 포함되는 내용을 추출하는 방법도 알고싶읍니다.


특정행에 내용을 입력시키는 경우에 대한 설명

예를들어 a라는 입력용 택스트 파일의 내용을 b라는 택스트 파일의 13번째에 붙여넣기를 합니다.

b라는 파일의 13째와 그 이후에 있는 내용은
(a라는 파일이 b의 13번째 줄부터 다 채워진후의 마지막줄의) 그 다음줄 부터 채워집니다.


[quote="mms64sk":3o5nitmc]- - -

제목

특정행의 내용을 출력하거나 입력시키는 방법?


특정행의 내용을 출력하는 경우에 대한 설명

예를들어 13번째 줄의 내용을 (표준출력이나 파일로) 출력 합니다.

2~3줄에 포함되는 내용을 추출하는 방법도 알고싶읍니다.


특정행에 내용을 입력시키는 경우에 대한 설명

예를들어 a라는 입력용 택스트 파일의 내용을 b라는 택스트 파일의 13번째에 붙여넣기를 합니다.

b라는 파일의 13째와 그 이후에 있는 내용은
(a라는 파일이 b의 13번째 줄부터 다 채워진후의 마지막줄의) 그 다음줄 부터 채워집니다.

    • -[/quote:3o5nitmc]
      13번째 줄 출력
      sed -n ‘13p’ 원본.txt
      cat 원본.txt| sed -n ‘13p’

2-3번째 줄 출력
sed -n ‘2,3p’ 원본.txt
cat 원본.txt| sed -n ‘2,3p’

13번째 줄에 파일내용 삽입 출력
sed ‘13r추가될내용.txt’ 원본.txt
cat 원본.txt| sed ‘13r추가될내용.txt’

13번째 줄에 파일내용 삽입 변경
sed -i ‘13r추가될내용.txt’ 원본.txt

-n 옵션을 자동으로 줄단위로 출력하지 않습니다. p명령으로 출력을 해줘야 합니다
-i 옵션은 읽은 파일을 바로 수정합니다.

13p : 13번째줄(주소) p(출력:print)
2,3p : 2번째줄에서 3번째 줄까지를 범위(주소)로 생각하고 출력
r파일.txt: 파일.txt를 읽어와서 덧붙임
13r파일.txt: 13번째줄(주소)에 파일.txt를 덧붙임

sed는 마법같은 프로그램입니다.
sed는 Stream Editor의 약자로 표준입력을 읽어서 편집하는 줄단위 편집기입니다.
정규표현식과 sed의 옵션과 sed의 명령(몇가지 안됩니다)을 아시면 많은 것들을 하실 수 있습니다.

{'}와 {"}의 차이점은 뭔가요?

일반적으로 문자열이라는 점에서 작은따옴표와 큰따옴표는 차이가 없습니다.
다만 쉘에서 작은따옴표는 그안의 내용을 번역하지 않고, 큰 따옴표는 번역을 합니다.

echo "$TERM"
결과: xterm

echo ‘$TERM’
결과: $TERM

echo ‘$(date)’
결과: $(date)

echo "$(date)"
결과: 2013. 10. 02. (수) 22:55:06 KST

예를 들어,
sed에서 $라는 끝줄, 혹은 그 줄의 끝을 의미하는데,
쉘에서는 그것을 변수로 취급하고, 그 변수의 값으로 대체합니다.
그러니 그러한 변환이 생기지 않게 작은 따옴표를 사용하는 것입니다.

예를 들어
d=100; echo -e "a\nb\nc" | sed ‘$d’ 라고 입력하게 되면
$는 마지막줄을 의미하고, d는 지우는 명령이라
a
b
이렇게 출력될 것입니다.
d=100; echo -e "a\nb\nc" | sed "$d" 라고 입력하게 되면
$d가 100으로 변환되어, sed "100"이 되어 오류가 발생합니다.

좀 더 상세히 말씀 드리자면,
sed "$d" 라고 입력할 경우,
readline이라는 라이브러리가 입력줄을 사용자 입력으로 부터 읽어냅니다.
이 과정에서 입력하다가 백스페이스 지운다던가, 수정한다던가 하는 작업이 가능합니다. 그게 readline이 하는 역할입니다.
그런데 그 다음 읽어낸 sed "$d"라는 내용의 문자열은 어디서 사용될까요? 그걸 누가 처리할까요?
다름 아닌 쉘이 처리합니다.
쉘은 우분투에서는 기본적으로 dash가 사용되고, bash가 설치된 경우 bash가 사용됩니다.
유닉스에서는 csh이 기본 쉘이죠.
쉘은 조개껍데기라는 뜻인데, 안의 내용물을 감싸고 있다는 의미로,
커널을 감싸고 있습니다.
그 감싸고 있는 외부는 바로 사용자나 프로그램 등입니다.
사용자가 프로그램이 무언가 입력하거나 명령하면 쉘이 그 내용을 받아서 자체적으로 처리를 하던지,
커널에게 처리를 요청합니다.
쉘은 사용자와 커널 사이에서 중간다리 역할을 합니다.

그러니까, sed "$d"라고 입력하면, readline에 의해 그 줄이 읽혀지고,
쉘에게 그 명령이 전달되고, 쉘은 그 명령을 해석합니다.
이 과정에서 bash쉘은 $d라는 것을 변수라고 생각하고, 그 값으로 대체하게 됩니다.
하지만 작은 따옴표를 사용하면, 변환하지 않고, 그대로 프로그램로더에 전달하게 됩니다.
프로그램로더는 프로그램을 실행해주는 놈입니다.
프로그램로더가 명령을 읽어서, sed라는 프로그램을 찾고, 메모리에 로드하고, 실행하면서 그 프로그램에 $d라는 내용을 전달합니다.
그 다음은 sed라는 프로그램에 제어권이 넘어가
sed라는 프로그램이 $d라는 내용을 번역하여 $는 마지막줄이구나, d는 지우는 명령이구나 하는 것입니다.

덧붙이자면…
sed 명령중 치환명령인 s명령을 사용하여 입력된 경로에서 파일명만 출력하는 예제를 작성해본다면,
echo ‘/etc/default/grub’|sed ‘s//([^/]+)$/\1/’ 이렇게 될텐데 지저분하고 읽기 힘들죠?
이럴때를 대비해 s명령에서는 슬래시외에 다른 문자를 사용할 수 있게 허용합니다.
echo ‘/etc/default/grub’|sed ‘s!/([^/]+)$!\1!’ 이런 식으로 말입니다.

님의 내용을 생각하면서 다시한번 "리눅스 실전가이드"책을 읽어 봤는대요.
이제야 이해가 되내요.; 고맙습니다. ^^;