awk 또는 sed를 사용하여 문자열을 재귀적으로 검색/교체하려면 어떻게 해야 합니까?
다음 항목을 모두 검색 및 교체하려면 어떻게 해야 합니까?
subdomainA.example.com
와 함께
subdomainB.example.com
/home/www/
디렉토리 트리가 재귀적으로 존재합니까?
find /home/www \( -type d -name .git -prune \) -o -type f -print0 | xargs -0 sed -i 's/subdomainA\.example\.com/subdomainB.example.com/g'
-print0
find
각 결과를 새 줄이 아닌 늘 문자로 구분하여 인쇄합니다.이 있는 에도 이 할 수 있습니다.xargs
이치노
\( -type d -name .git -prune \)
는, 「」라고 하는 이름의 모든 것을 하게 건너뛰는 입니다..git
할 수 더이름과 됩니다. SVN을 사용하거나 보존할 다른 폴더가 있는 경우 쉽게 확장할 수 있습니다. 더 많은 이름과 대조하기만 하면 됩니다.에 -not -path .git
디렉토리내의 모든 파일을 체크하는 대신에, 완전하게 스킵 하기 때문에, 보다 효율적입니다.-o
은, 「」의 방법에 의한 것입니다.-prune
실제로 효과가 있습니다.
것에 대하여는, 「 」, 「 」를 해 주세요.man find
.
가장 간단한 방법은
grep -rl oldtext . | xargs sed -i 's/oldtext/newtext/g'
참고: git repo를 포함한 폴더에서는 이 명령을 실행하지 마십시오. .git으로 변경하면 git 인덱스가 손상될 수 있습니다.
find /home/www/ -type f -exec \
sed -i 's/subdomainA\.example\.com/subdomainB.example.com/g' {} +
여기의 다른 답변과 비교하면, 이것은 대부분의 답변보다 단순하며, 원래 질문에서 요구한 perl 대신 sed를 사용합니다.
모든 속임수는 거의 비슷하지만, 나는 이것을 좋아한다.
find <mydir> -type f -exec sed -i 's/<string1>/<string2>/g' {} +
find <mydir>
합니다.: 디렉토리에서 검색합니다.-type f
파일은 일반 파일 형식입니다.
-exec command {} +
:이 유형의 -exec 액션에서는 선택한 파일에 대해 지정된 명령어가 실행되지만 명령줄은 선택한 각 파일 이름을 끝에 추가하여 구축됩니다. 명령어 호출의 총 수는 일치하는 파일 수보다 훨씬 적습니다.명령줄은 xargs가 명령줄을 작성하는 것과 거의 동일한 방식으로 구축됩니다.명령어 내에는 '{}' 인스턴스가 하나만 허용됩니다.이 명령어는 시작 디렉토리에서 실행됩니다.
저에게 있어서 가장 기억하기 쉬운 솔루션은 https://stackoverflow.com/a/2113224/565525,입니다.
sed -i '' -e 's/subdomainA/subdomainB/g' $(find /home/www/ -type f)
주의:-i ''
OSX 문제 해결sed: 1: "...": invalid command code .
주의: 처리해야 할 파일이 너무 많으면 다음 메시지가 나타납니다.Argument list too long
- 를 find -exec
★★★★★★★★★★★★★★★★★」xargs
를 참조해 주세요.
cd /home/www && find . -type f -print0 |
xargs -0 perl -i.bak -pe 's/subdomainA\.example\.com/subdomainB.example.com/g'
ag SearchString -l0 | xargs -0 sed -i 's/SearchString/Replacement/g'
ag는 기본적으로 git/hg/svn 파일/폴더를 무시하므로 저장소 내에서 실행해도 안전합니다.
이것은 git 저장소와 호환되며 조금 더 간단합니다.
Linux:
git grep -l 'original_text' | xargs sed -i 's/original_text/new_text/g'
Mac:
git grep -l 'original_text' | xargs sed -i '' -e 's/original_text/new_text/g'
(http://blog.jasonmeridth.com/posts/use-git-grep-to-replace-strings-in-files-in-your-git-repository/) 덕분에)
을 sed
를 통해,은 ,, 할, 할, 할을 수 있다.grep
다음 중 하나:
grep -rl <oldstring> /path/to/folder | xargs sed -i s^<oldstring>^<newstring>^g
<고객명>을man grep
도 이렇게 ' 낫다'를 할 수 --exlude-dir="*.git"
.디렉토리에서를 붙입니다.합니다.flags 디렉토리에서 검색을 생략하고 싶을 경우 플래그를 붙입니다.다른 사람들이 정중하게 지적한 git 인덱스 문제를 회피합니다.
다음과 같은 이유:
grep -rl --exclude-dir="*.git" <oldstring> /path/to/folder | xargs sed -i s^<oldstring>^<newstring>^g
디렉토리를 제외할 필요가 있는 경우는, 간단한 방법(--exclude-dir=..folder
공백이 있는 파일 이름(양쪽 모두 0Byte를 사용하여 해결)도 사용할 수 있습니다.grep -Z
★★★★★★★★★★★★★★★★★」xargs -0
)
grep -rlZ oldtext . --exclude-dir=.folder | xargs -0 sed -i 's/oldtext/newtext/g'
엑스트라로 멋진 오넬라이너 하나.git grep 사용.
git grep -lz 'subdomainA.example.com' | xargs -0 perl -i'' -pE "s/subdomainA.example.com/subdomainB.example.com/g"
가장 간단한 치환 방법(모든 파일, 디렉토리, 재귀적)
find . -type f -not -path '*/\.*' -exec sed -i 's/foo/bar/g' {} +
주의: 일부 숨겨진 파일은 무시해야 할 수 있습니다. .git
위의 명령어를 사용할 수 있습니다.
숨김 파일 사용을 포함하려면
find . -type f -exec sed -i 's/foo/bar/g' {} +
모두 " " " "foo
됩니다.bar
find /home/www/ -type f -exec perl -i.bak -pe 's/subdomainA\.example\.com/subdomainB.example.com/g' {} +
find /home/www/ -type f
/home/www/(으)로 설정합니다.는 발견된 각 다음 합니다."-exec" "실행"
perl -i.bak -pe 's/subdomainA\.example\.com/subdomainB.example.com/g' {} +
는 파일에서 실행되는 명령어입니다(한 번에 여러 개).{}
파일명으로 대체됩니다.+
명령어 마지막에 알립니다.find
여러 파일 이름에 대해 하나의 명령어를 작성합니다.
에 find
page: "하는 것과 거의 됩니다.": "xargs" "xargs는 명령줄을 구축하는 것입니다
'스페이스가을 사용하지 할 수 xargs -0
, 「」-print0
.
저는 단지 이것이 필요했을 뿐이며, 이용 가능한 예시의 속도에 만족하지 못했습니다.그래서 나는 나만의 것을 생각해냈다.
cd /var/www && ack-grep -l --print0 subdomainA.example.com | xargs -0 perl -i.bak -pe 's/subdomainA\.example\.com/subdomainB.example.com/g'
Ack-grep은 관련 파일을 찾는 데 매우 효율적입니다.이 명령어는 약 145,000개의 파일을 쉽게 대체한 반면, 다른 명령어는 너무 오래 걸려서 완료될 때까지 기다릴 수 없었습니다.
또는 초고속 GNU 병렬을 사용합니다.
grep -rl oldtext . | parallel sed -i 's/oldtext/newtext/g' {}
grep -lr 'subdomainA.example.com' | while read file; do sed -i "s/subdomainA.example.com/subdomainB.example.com/g" "$file"; done
대부분의 사람들은 "읽는 동안 파일"에 무언가를 파이프로 연결할 수 있다는 것을 알지 못하고 파일 이름에 공간을 미리 구분하면서 이러한 지저분한 -print0 arg를 피할 수 있다고 생각합니다.
「 」의 추가echo
할 수 있습니다.sed 사를 를 before before before before before before 。
이것을 시험해 보세요.
sed -i 's/subdomainA/subdomainB/g' `grep -ril 'subdomainA' *`
이 블로그 투고에 따르면:
find . -type f | xargs perl -pi -e 's/oldtext/newtext/g;'
#!/usr/local/bin/bash -x
find * /home/www -type f | while read files
do
sedtest=$(sed -n '/^/,/$/p' "${files}" | sed -n '/subdomainA/p')
if [ "${sedtest}" ]
then
sed s'/subdomainA/subdomainB/'g "${files}" > "${files}".tmp
mv "${files}".tmp "${files}"
fi
done
you면면면면면을 사용해도 vim
grep
★★★★★★★★★★★★★★★★★」find
툴은 이 링크에서 사용자 Gert에 의해 제공된 답변을 확인할 수 있습니다.-> 큰 폴더 계층에서 텍스트 치환을 수행하는 방법
이게 조건이다:
GREP' (은 (')가 .
$(grep 'string' 'pathname' -Rl)
.( 이러한 경우는,과 같이 할 수도 ( ) 일 、 [ ] 、 [ ] 、 [ ] 、 음음 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 。
cp -iv $(grep 'string' 'pathname' -Rl) 'centralized-directory-pathname'
그바바바/ after바 、 바바 / 꾸바바바 after 。
vim
다음 링크에서 제공되는 것과 유사한 방식을 따릅니다.:bufdo %s#string#replacement#gc | update
다음과 같이 awk를 사용하여 해결할 수 있습니다.
for file in `find /home/www -type f`
do
awk '{gsub(/subdomainA.example.com/,"subdomainB.example.com"); print $0;}' $file > ./tempFile && mv ./tempFile $file;
done
이것이 당신에게 도움이 되길 바랍니다!!!
git 저장소의 모든 항목을 바꾸려면 다음을 사용할 수 있습니다.
git ls-files -z | xargs -0 sed -i 's/subdomainA\.example\.com/subdomainB.example.com/g'
로컬 git repo에 파일 나열을 참조하십시오.저장소의 모든 파일을 나열하는 기타 옵션입니다.그-z
에 의해, 옵션 「git」의 「0」이 됩니다.이것에 의해, 다음의 것이 보증됩니다.xargs
)-0
는 공백 을 구분할 수
SVN 저장소를 완전히 파괴하지 않고 이 기능을 사용하려면 다음을 수행하여 숨겨진 모든 파일을 무시하도록 '찾기'를 지시할 수 있습니다.
find . \( ! -regex '.*/\..*' \) -type f -print0 | xargs -0 sed -i 's/subdomainA.example.com/subdomainB.example.com/g'
조금 구식이지만 OS X에서는 동작했습니다.
몇 가지 속임수가 있습니다.
• 한다. • 확장자를 가진 파일만 편집한다.sls
.
빠져나가야 .sed
은 ' 캐릭터하지 않습니다.
,
.sed
인 "Delimiter"가 아닌 ""를 합니다./
하여 진자 템플릿을 것입니다.variable
의 경로로import
(서양속담, 서양속담)
먼저 sed 명령어가 원하는 기능을 수행하는지 확인합니다(이 명령어는 stdout으로 변경 내용을 출력할 뿐 파일은 변경되지 않습니다).
for file in $(find . -name *.sls -type f); do echo -e "\n$file: "; sed 's,foo\.bar,foo/bar/\"+baz+\"/,g' $file; done
변경할 준비가 되면 필요에 따라 sed 명령을 편집합니다.
for file in $(find . -name *.sls -type f); do echo -e "\n$file: "; sed -i '' 's,foo\.bar,foo/bar/\"+baz+\"/,g' $file; done
해 주세요.-i ''
sed 명령에서는 원본 파일의 백업을 만들고 싶지 않았습니다(OS X의 sed를 사용한 내부 편집 또는 이 페이지의 Robert Lujo 코멘트 참조).
행복한 씨뿌리개 여러분!
단지 변화를 피하기 위해
- NearlysubdomainA.example.com
- subdomainA.example.comp.other
그래도
- subdomainA.example.com 를 참조해 주세요.좋습니까?
(도메인 루트의 배후에 있는 아이디어에서는 좋지 않을 수 있습니다)
find /home/www/ -type f -exec sed -i 's/\bsubdomainA\.example\.com\b/\1subdomainB.example.com\2/g' {} \;
대부분의 더. 이 은 필요하지 find
(사용)du
를를 、 를예 、 들를 。「」가합니다.xargs
플랜 9의 일부 버전(9프론트 등)에서만 볼 수 있습니다.
du -a | awk -F' ' '{ print $2 }' | xargs sed -i -e 's/subdomainA\.example\.com/subdomainB.example.com/g'
등의 는, 「」를 사용합니다.grep
:
du -a | grep "\.scala$" | awk -F' ' '{ print $2 }' | xargs sed -i -e 's/subdomainA\.example\.com/subdomainB.example.com/g'
IBMi의 Qshell(qsh)의 경우 OP에 의해 태그된 bash가 아닙니다.
qsh 명령어의 제한:
- find에는 -print0 옵션이 없습니다.
- xargs에는 -0 옵션이 없습니다.
- sed에는 -i 옵션이 없습니다.
따라서 qsh의 솔루션은 다음과 같습니다.
PATH='your/path/here'
SEARCH=\'subdomainA.example.com\'
REPLACE=\'subdomainB.example.com\'
for file in $( find ${PATH} -P -type f ); do
TEMP_FILE=${file}.${RANDOM}.temp_file
if [ ! -e ${TEMP_FILE} ]; then
touch -C 819 ${TEMP_FILE}
sed -e 's/'$SEARCH'/'$REPLACE'/g' \
< ${file} > ${TEMP_FILE}
mv ${TEMP_FILE} ${file}
fi
done
경고:
- 솔루션에서 오류 처리 제외
- OP에 의해 태그된 Bash가 아님
「」의 grep
★★★★★★★★★★★★★★★★★」sed
for pp in $(grep -Rl looking_for_string)
do
sed -i 's/looking_for_string/something_other/g' "${pp}"
done
perl -p -i -e 's/oldthing/new_thingy/g' `grep -ril oldthing *`
을 "백업"으로 하다)*.bak
perl -p -i -e "s/\|/x/g" *
해, 「」를 치환합니다.|
" pie합니다.펄파이(Perl pie)
언급URL : https://stackoverflow.com/questions/1583219/how-can-i-do-a-recursive-find-replace-of-a-string-with-awk-or-sed
'programing' 카테고리의 다른 글
iOS에서 바코드를 스캔하려면 어떻게 해야 합니까? (0) | 2023.04.10 |
---|---|
Swift 3에서 커스텀 알림을 작성하려면 어떻게 해야 합니까? (0) | 2023.04.10 |
Windows 명령어프롬프트에서 환경변수를 갱신하는 명령어가 있습니까? (0) | 2023.04.10 |
Windows 및 Linux에서의 C++ 컴파일: ifdef 스위치 (0) | 2023.04.10 |
Windows에서 스크린샷을 파일에 직접 저장하려면 어떻게 해야 합니까? (0) | 2023.04.10 |