다른 파일에서 지정된 문자열을 포함하는 줄 삭제

다른 파일에서 지정된 문자열을 포함하는 줄 삭제

web/이름이 foo.phpand 라고 가정합니다 bar.php. 첫 번째 줄 foo.php은 "sdajgeSTRINGdsad"이고 열 번째 줄 bar.php은 "gdfhu98324STRING"입니다. 작업은 먼저 이 두 파일을 찾은 다음 지정된 문자열이 "STRING"이기 때문에 foo.php의 라인 1과 bar.php의 라인 10을 삭제하는 것입니다.

답변1

sed다음을 수행할 수 있습니다.

sed -i.bak '/STRING/d' web/*

답변2

문자열이 포함된 파일을 찾으려면 STRING을 포함하는 파일과 모든 하위 디렉터리를 grep찾으려면 다음을 사용하세요.web/

grep -R "STRING" 네트워크/

파일을 편집하고 문자열이 포함된 줄을 삭제하는 데에는 여러 가지 옵션이 있지만 여기에는 두 가지 일반적인 옵션이 있습니다. 전체 행에 대해 작업을 수행하려고 하므로 이는 매우 간단합니다. :)

grep첫째, 인수를 사용하여 -v검색을 반전하고 출력에서 ​​일치하는 행을 표시하는 대신 숨길 수 있습니다. 첫 번째 파일에 대해 우리는sponge. 이를 통해 파일을 읽고 필터링한 다음 동일한 파일에 다시 쓸 수 있습니다. 이 모든 작업을 한 번에 수행할 수 있습니다.

grep -v "sdajgeSTRINGdsad" foo.php | sponge foo.php

두 번째 예에서는 를 사용하여 동일한 작업을 수행 grep하지만 해당 파일이 없으면 sponge다른 파일에 기록한 다음 파일을 다시 원래 이름으로 이동할 수 있습니다.

grep -v "gdfhu98324STRING" bar.php  > bar.php.cleaned
mv bar.php{.cleaned,}

sed두 번째 방법은 d줄 제거 명령과 함께 사용됩니다. 첫 번째 예에서는 .bk백업 파일을 생성하는 옵션 과 함께 내부 파일 편집을 사용합니다 .

sed -i.bk '/sdajgeSTRINGdsad/d'  foo.php

파일을 직접 복사한 다음 sed를 사용하여 백업을 필터링하고 원본 파일을 덮어쓰면 거의 동일한 작업을 수행할 수 있습니다.

cp bar.php bar.php.bk
sed '/gdfhu98324STRING/d' bar.php.bk > bar.php

이제 이 두 가지 작업을 결합하세요! 다른 문자열을 사용하여 이 작업을 반복적으로 수행할 수 있는 함수를 만들어 보겠습니다.

function nuke_string () {
    string="$1"
    path="$2"
    grep -R -l "$string" "$path" | while IFS= read -r file; do
        sed -i.bk "/$string/d" "$file"
    done
}

함수를 만든 후 다음과 같이 사용할 수 있습니다.

nuke_string "STRING" web/

STRING을 포함하는 web/의 모든 파일에서 이 줄이 제거되고 원본 버전의 백업 복사본이 만들어집니다. 현재 셸에서 이러한 함수를 생성하거나 .bashrc파일에 기록하여 항상 사용 가능하게 만들 수 있습니다.

답변3

grep -l그냥 와 함께 사용하세요 -R! 이것은 완전한 단일 라이너입니다.

grep -Rl "STRING" web/ | xargs sed -i "/STRING/d"

답변4

Ex 모드에서 Vim을 사용할 수 있습니다:

for k in web/*.php
do
  ex -sc '/STRING/d|x' "$k"
done
  1. d삭제

  2. x저장하고 닫습니다

관련 정보