sed로 특정 문자열을 포함한 라인 삭제하기
글쓴이: thisrule / 작성시간: 월, 2005/06/20 - 2:33오후
특정 문자열을 포함한 라인 삭제하려는 대상의 파일이 수백개 있습니다.
vi에서는 :%g/찾을문자열/d 하면 간단히 되는데 이런 파일이 여러개 있으니 당황스럽네요.
sed로 그렇게 할 수 있을거 같은데 잘 안됩니다.
kldp에 있는 sed manual에 문자열 치환은 있는데 라인 삭제는 없네요. :(
아시는 분들의 도움 바랍니다.
Forums:
[code:1]sed /찾는 문자열/d file[/code:1]하시면
sed /찾는 문자열/d file
하시면 찾는 문자열을 포함하는 줄을 제외한 나머지 줄만 출력됩니다.여러 파일에 적용한 후 결과를 새로운 파일에 저장하려면 스크립트 속에서 사용하셔야할 것 같습니다.
감사^^
잘 적용했습니다. 감사해요~
[code:1]#!/bin/sh cd /home/uman/targ
이렇게 하면 될라나요?? (돌려보지는 않았습니다. )
인생의 무게를 느껴라. 아는 만큼 보이는게다.
vi 로 하시던거면 vi 로 할 수 있어요.[code:1]vi -
vi 로 하시던거면 vi 로 할 수 있어요.
vi -c "%g/찾을문자열/d" -c "wq" filename
find 랑 연동하면 되겠죠.
https://xenosi.de/
[quote="송효진"]vi 로 하시던거면 vi 로 할 수 있어요.
파일 하나에 대해선 잘 되는데 여러 파일로 하니깐 잘 안되네요.
vi -c "%g/찾을문자열/d" -c "wq" *.txt
하니깐 첫번째 파일을 잘 되는데 나머지 파일엔 적용되지 않습니다.
그냥 sed로 해보아야 겠습니다.
find 와 연동이요...[code:1]find . -type f
find 와 연동이요...
find . -type f -name *.txt -exec vi -c "%g/찾을문자열/d" -c "wq" "{}" \;
https://xenosi.de/
[quote="송효진"]find 와 연동이요...[code:1]f
find에서 -name에 *을 사용할 경우는 ""로 묶어주는 센스~~
What do you want to eat?
sed 는 아니지만grep -v string file이렇게 하셔도
sed 는 아니지만
grep -v string file
이렇게 하셔도..
http://home.postech.ac.kr/~sodomau
[quote="sodomau"]sed 는 아니지만grep -v str
grep -v option은 해당 파일에서 string이 없는 라인을 찾아주는거 아닌가요?
즉, 원래 grep의 반대동작이요. 좀 착각하신듯...
원하는 목적이 매칭되는 줄을 지우는 것이므로 활용은 되겠네요.grep
원하는 목적이 매칭되는 줄을 지우는 것이므로 활용은 되겠네요.
grep -v 매치 file > file.out
문제는 파일을 직접 수정하지는 못하니, 스크립트를 하나 짜야 하는 번거로움이 있겠네요.
https://xenosi.de/
[quote="송효진"]원하는 목적이 매칭되는 줄을 지우는 것이므로 활용
오! 그렇군요. 제가 착각했네요. :oops:
perl도 괜찮다면[code:1]perl -pi -e "
perl도 괜찮다면
perl -pi -e "s/.*문자열.*//s" *.txt
정도면 어떨까요?
한 파일에서 특정 문자열이 나오는 줄을 삭제하는 것은 sed(1)의 'd
한 파일에서 특정 문자열이 나오는 줄을 삭제하는 것은 sed(1)의 'd' 명령으로 가능합니다. 예를 들어 "asdf"이 있는 줄을 삭제하는 것은 다음과 같습니다:
그러나 sed로 기존 파일을 변경하는 것을 불가능하기 때문에 다음과 같이 script를 작성하면 됩니다 (편의상 tmp.sh라고 합시다):
그리고 아까 만들어둔 tmp.txt를 t1.txt, t2.txt, t3.txt로 복사했습니다:
그리고 나서 주어진 script를 실행하면:
그럼 이만. :wink:
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
cinsk님의 스크립트에서1. trap 명령을 쓴 이유2. s
cinsk님의 스크립트에서
1. trap 명령을 쓴 이유
2. sed 출력을 바로 새 파일에 쓰지 않고 $tmpfile에 썼다가 mv하는 이유
가 궁금합니다. $tmpfile을 거치는 것은 보안 때문에 그렇다는 감만 잡고 있지 구체적인 것은 잘 몰라서...
설명하기 귀찮으시면 링크라도 좀...
보통 filter 형태로 쓰이는 프로그램들은, source를 덮어 쓰게
보통 filter 형태로 쓰이는 프로그램들은, source를 덮어 쓰게 작업할 수가 없습니다. 따라서, 임시로 다른 파일에 저장한 다음, 그 것을 덮어 쓰는 방법을 주로 씁니다. 요청하신 내용이, 특정 줄을 제거하는 방법이었으므로, 결국 주어진 source에 어떤 가공을 한 다음, 다시 source에 덮어 쓰는 것으로 판단했습니다. 이 경우, redirection을 써서 source를 덮어 쓰게 될 경우, source 자체가 사라질 위험이 있습니다. 즉, 다음과 같은 명령은 상당히 위험합니다.
$ filter_program source > source
따라서 결과를 임시 파일에 저장하고, 그 것을 다시 source로 덮어쓰는 방식을 씁니다:
그런데, script 실행 도중 break 키를 누른다거나 하는 등의 interrupt가 발생하면, temporary가 만들어진 상태에서 script가 중단될 경우가 있습니다. 이런 경우가 자주 발생하면, 쓸모없는 임시 파일들이 어디엔가 쌓이겠죠. 이 것을 방지하기 위해서, trap 명령을 써서, 중간에 특정 interrupt (signal)가 발생할 경우, script를 끝내기 전에, 강제로 임시 파일을 지우게 만듭니다.
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
cinsk님 답변 감사합니다.보안 때문이 아니라 원본과 같은 이름
cinsk님 답변 감사합니다.
보안 때문이 아니라 원본과 같은 이름을 갖는 출력을 얻기 위한 것이었군요. 만약 원본과 출력이 다른 이름을 갖는다면 다음과 같이 간단하게 할 수 있겠네요.
sub directory 까지
sub directory 까지 되려면 어떻게 해야 하나요? recrusive 하게요..
댓글 달기