sed는 정말 강력한 명령어입니다.
디버깅을 위해서 source의 define이나 코드들을 변경해야 할 때, 그때마다 source를 열어서 변경하지 않고, shell script를 실행해서 변경하고자 할 때 유용합니다.
이미 많은 post들이 있지만, 이글을 쓰는 이유는 sed를 이용해서 하나의 line 뿐만 아니라, 두개의 line에 대해서도 작업을 할 수 있었고, 이를 정리하기 위해서 입니다.
기본적인 예제는 다음과 같습니다.
1. 이름이 '파일_name'인 파일에서 '찾고자 하는 문자열'을 가진 문자열을 출력하는 예제
sed -n '/찾고자 하는 문자열/p' 파일_name
'찾고자 하는 문자열'에 대해서 다양한 패턴들을 넣어서 실험할 때, 실제로 해당 패턴들이 정상적으로 동작하는지 출력을 통해서 확인할 수 있습니다.
즉, sed를 이용해서 shell script를 작성하기에 앞서, 실제 동작 검증용(디버깅용)으로 사용할 수 있습니다.
2. 이름이 '파일_name'인 파일에서 문장이 '//#define ENABLE_TEST' 문자열로 시작하는 경우, 해당 문자열을 '#define ENABLE_TEST'로 변경하는 예제
sed -i 's/^\/\/#define ENABLE_TEST/#define ENABLE_TEST/' 파일_name
3. 이름이 '파일_name'인 파일에서, 'something'이라는 문자열을 찾고, 'something'이라는 문자열을 포함하여 5줄(+5)을 제거(d)하는 예제 (https://ksr930.tistory.com/14)
$ sed -i '/something/,+5 d' 파일_name
4. 이름이 '파일_name'인 파일에서, 'something'이라는 문자열을 갖는 라인을 찾고, 다음 라인에서 'special'이라는 문자열이 있는 경우 처리하는 예제
(https://stackoverflow.com/questions/18620153/find-matching-text-and-replace-next-line/18622953)
# 1
sed -n '/something/{n;/special/p}' 파일_name
# 2
sed -n '/something/{n;s/special/not special/p}' 파일_name
# 3
sed -i '/something/{n;s/special/not special/}' 파일_name
위의 코드에는 3개의 예제가 있습니다.
'# 1'은 'something'이라는 문자열이 있는 라인을 찾고, 다음 라인에 'special'이 있으면 출력합니다. (초기 디버깅용)
'# 2'은 'something'이라는 문자열이 있는 라인을 찾고, 다음 라인에 'special'이 있으면 'not special'로 변경한 후 출력합니다. (초기 디버깅용)
'# 3'은 'something'이라는 문자열이 있는 라인을 찾고, 다음 라인에 'special'이 있으면 'not special'로 파일을 변경합니다. (최종)
위에 참고한 post들은 적었고, (저도 다 읽지는 않았습니다만) 추가로 유용해 보이는 post들은 다음과 같습니다.
https://jhnyang.tistory.com/287
https://snipcademy.com/shell-scripting-sed#the-hold-buffer-space
- 끝 -
'프로그래밍 > Linux_commands' 카테고리의 다른 글
[Linux] uniq (0) | 2019.12.15 |
---|---|
[Linux] find (0) | 2019.12.15 |
[Linux] grep (0) | 2019.04.24 |