web/
이름이 foo.php
and 라고 가정합니다 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
d
삭제x
저장하고 닫습니다