답변:
라인을 제거하고 출력을 표준 출력으로 인쇄하려면 :
sed '/pattern to match/d' ./infile
파일을 직접 수정하려면 – BSD sed에서 작동하지 않습니다.
sed -i '/pattern to match/d' ./infile
동일하지만 BSD sed (Mac OS X 및 FreeBSD)의 경우 – GNU sed에서 작동하지 않습니다.
sed -i '' '/pattern to match/d' ./infile
파일을 직접 수정하고 백업을 작성하려면 – BSD 및 GNU sed와 함께 작동합니다.
sed -i.bak '/pattern to match/d' ./infile
sed '/pattern to match/d' ./infile > ./newfile
하거나 내부 편집을 원한다면 -i
sed에 플래그를 추가 할 수 있습니다 sed -i '/pattern to match/d' ./infile
. 이 -i
플래그에는 GNU sed가 필요하며 이식성이 없습니다.
sed -i.backup '/pattern to match/d' ./infile
그것은 바로 편집 할 수있게 해주었습니다.
sed
버전이 제어되지 않은 파일에는 명령을 적용하지 않는 것 입니다.
sed -i '' '/pattern/d' ./infile
.
이외에도 특정 문자열이있는 행을 삭제하는 방법에는 여러 가지가 있습니다 sed
.
awk '!/pattern/' file > temp && mv temp file
ruby -i.bak -ne 'print if not /test/' file
perl -ni.bak -e "print unless /pattern/" file
while read -r line
do
[[ ! $line =~ pattern ]] && echo "$line"
done <file > o
mv o file
grep -v "pattern" file > temp && mv temp file
그리고 물론 sed
(역을 인쇄하는 것이 실제 삭제보다 빠릅니다) :
sed -n '/pattern/!p' file
sed
예는 다른 행동을 가지고, 그것은 단지 greps! 다음과 같아야 sed -n -i '/pattern/!p' file
합니다.
grep -v "pattern" file > temp; mv temp file
이것은 반환 값에 따라 다른 예제 중 일부에 적용될 수 있습니다.
seq -f %f 10000000 >foo.txt
. sed d : time sed -i '' '/6543210/d' foo.txt
실제 0m9.294 sed! p : time sed -i '' -n '/6543210/!p' foo.txt
실제 0m13.671s. (파일이 작을수록 차이가 큽니다.)
sed를 사용하여 파일에서 줄을 바꿀 수 있습니다. 그러나 grep을 두 번째 파일로 반전 한 다음 두 번째 파일을 원본 위로 옮기는 것보다 속도가 훨씬 느린 것 같습니다.
예 :
sed -i '/pattern/d' filename
또는
grep -v "pattern" filename > filename2; mv filename2 filename
어쨌든 첫 번째 명령은 내 컴퓨터에서 3 배 더 오래 걸립니다.
sed '/pattern/d' filename > filename2; mv filename2 filename
GNU로하는 쉬운 방법 sed
:
sed --in-place '/some string here/d' yourfile
-r
옵션을 사용하십시오 (또는 -E
버전에 따라). 이 정규식 메타 문자의 사용을 가능하게 +
, ?
, {...}
와 (...)
.
다음을 사용 ex
하는 것이 좋습니다 (표준 Unix 명령 기반 편집기 임).
ex +g/match/d -cwq file
어디:
+
실행 (쓰기 및 종료)과 man ex
동일하게 지정된 Ex 명령 ( ) -c
을 실행합니다.wq
g/match/d
-주어진 줄을 삭제하는 Ex 명령은 다음 match
을 참조하십시오 : g의 거듭 제곱위의 예는이 게시물에 따라 Unix.SE 및 POSIX 사양ex
의 파일을 편집하는 POSIX 호환 방법 입니다 .
차이점 sed
은 다음과 같습니다.
sed
A는 S tream ED 당사 홈페이지가 아닌 파일 편집기. BashFAQ
이식 불가능한 코드, I / O 오버 헤드 및 기타 나쁜 부작용을 즐기지 않는 한. 따라서 기본적으로 일부 매개 변수 (예 : in-place / -i
)는 비표준 FreeBSD 확장이며 다른 운영 체제에서는 사용하지 못할 수 있습니다.
man ex
남자를 줄 때 vim
, 그것은 ex
vim의 일부 인 것 같습니다 ... 바로 패턴 구문 match
이 vimregex.com 이라는 것을 이해한다면 POSIX 및 PCRE 풍미와 비슷하지만 다릅니다.
나는 Mac에서 이것으로 고투하고 있었다. 또한 변수 교체를 사용하여해야했습니다.
그래서 나는 다음을 사용했다.
sed -i '' "/$pattern/d" $file
where $file
는 삭제가 필요한 파일이며 삭제 $pattern
를 위해 일치시킬 패턴입니다.
''
이 의견 에서를 선택했습니다 .
여기서주의 할 점은에 큰 따옴표 를 사용하는 것 입니다 "/$pattern/d"
. 작은 따옴표를 사용하면 변수가 작동하지 않습니다.
sed
은 뒤에 매개 변수가 필요 -i
하므로 백업을 원하지 않으면 빈 문자열을 추가해야합니다.-i ''
sed -i "/$pattern/d" $file
. 답변 주셔서 감사합니다.
약 345 000 줄을 포함하는 파일로 작은 벤치 마크를 만들었습니다. 이 방법 grep
은 sed
방법 보다 약 15 배 빠릅니다 .
LC_ALL = C 설정을 사용하거나 사용하지 않고 시도했지만 타이밍을 크게 변경하지 않는 것 같습니다. 검색 문자열 (CDGA_00004.pdbqt.gz.tar)은 파일 중간에 있습니다.
명령과 타이밍은 다음과 같습니다.
time sed -i "/CDGA_00004.pdbqt.gz.tar/d" /tmp/input.txt
real 0m0.711s
user 0m0.179s
sys 0m0.530s
time perl -ni -e 'print unless /CDGA_00004.pdbqt.gz.tar/' /tmp/input.txt
real 0m0.105s
user 0m0.088s
sys 0m0.016s
time (grep -v CDGA_00004.pdbqt.gz.tar /tmp/input.txt > /tmp/input.tmp; mv /tmp/input.tmp /tmp/input.txt )
real 0m0.046s
user 0m0.014s
sys 0m0.019s
이것을 사용할 수도 있습니다 :
grep -v 'pattern' filename
여기서는 -v
패턴 이외의 것만 인쇄합니다 (반전 일치).
누군가가 정확한 문자열 일치를 위해 그것을 원한다면, -w
grep-w 의 플래그를 전체적으로 사용할 수 있습니다 . 예를 들어, 번호가 11 인 행을 삭제하지만 번호가 111 인 행을 유지하려는 경우 :
-bash-4.1$ head file
1
11
111
-bash-4.1$ grep -v "11" file
1
-bash-4.1$ grep -w -v "11" file
1
111
-f
한 번에 여러 개의 정확한 패턴을 제외하려는 경우 플래그 와 함께 작동합니다 . "blacklist"가 "file"에서 삭제하려는 각 행에 여러 패턴이있는 파일 인 경우 :
grep -w -v -f blacklist file
-w, --word-regexp Select only those lines containing matches that form whole words.
vs.-x, --line-regexp Select only those matches that exactly match the whole line. For a regular expression pattern, this is like parenthesizing the pattern and then surrounding it with ^ and $.
cat filename | grep -v "pattern" > filename.1
mv filename.1 filename
처리 된 텍스트를 콘솔에 표시
cat filename | sed '/text to remove/d'
처리 된 텍스트를 파일로 저장
cat filename | sed '/text to remove/d' > newfile
처리 된 텍스트 정보에 기존 파일을 추가
cat filename | sed '/text to remove/d' >> newfile
이미 처리 된 텍스트를 처리하려면이 경우 제거 된 줄을 더 제거
cat filename | sed '/text to remove/d' | sed '/remove this too/d' | more
는 | more
한 번에 한 페이지의 덩어리에 텍스트를 표시합니다.