순차변수를 사용하여 패턴 발생을 검색하고 대체합니다.

순차변수를 사용하여 패턴 발생을 검색하고 대체합니다.

여러 파일/하위 디렉터리에서 변수를 업데이트해야 합니다. 대체될 변수는 동일한 6자로 시작하며 그 이후의 모든 변수는 무작위입니다. 처음 6자를 찾기/바꾸기 패턴으로 사용하겠습니다. 뒤에 나오는 임의의 문자를 순차 변수로 바꾸겠습니다.

어떤 유틸리티가 이에 가장 적합한지는 잘 모르겠지만 sed가 일종의 루프에 있다고 상상해 보세요. 나는 이것을 달성하는 최선의 방법을 상상하려고 노력하고 있습니다. 나는 이것이 다음과 같은 것으로 이루어질 수 있다고 상상합니다.

#!/bin/bash  
i=0  
grep -r '/parent/sub/' -e 'pattern' | while read line  
do  
sed 's/pattern*/pattern$i/g'  
((i++))  
done

내 첫 번째 질문은 sed가 이와 같이 사용될 수 있는지 모르고 두 번째로 루프에 중첩되어 있기 때문에 grep 명령에서 필요한 줄을 어떻게 공급합니까(또는 여기서 grep보다 더 좋은 방법이 있습니까)입니다. 사용?)

감사해요

답변1

다음 스크립트가 작업을 수행합니다.

#!/bin/bash
i=0 
grep -rl --exclude=${0:2} . -e pattern | while read -r line               
do                                                
    sed -i 's/pattern\(.*\)/pattern'$i'/' "$line"    
    ((i++))                                           
done

while루프는 "패턴" 인스턴스를 포함하는 현재 디렉터리의 모든 파일 이름을 반복합니다(하위 폴더에서도 반복적으로). 를 사용하면 sed줄에서 'pattern' 뒤의 모든 항목을 바꿀 수 있습니다( \(.*\)group, 'pattern' 및 counter 값으로 표시됨 i).


노트:

  • 이는 서로 다른 줄에 많은 "패턴" 문자열이 있는 경우에도 작동하지만, "패턴" 뒤의 모든 문자열이 교체되므로 같은 줄에 여러 개의 "패턴" 문자열이 있는 경우에는 작동하지 않습니다.
  • sed -i파일을 제자리에 교체하고, 파일이 모든 것을 올바르게 교체하는지 확인하려면 제거하세요 -i.
  • --exclude=${0:2}grep해당 옵션 을 사용하지 않고 현재 디렉터리에서 검색하면 "pattern" 문자열이 포함되어 있으므로 스크립트 파일 이름과도 일치하기 때문에 해당 옵션을 호출에 추가했습니다 !

답변2

이 도구는 사용됩니다찾다find대신 파일 이름은 grep도구 이름에 큰 힌트가 있습니다. grep이다G전 세계적으로 하나를 찾아보세요오른쪽정기적인두번째파일/스트림의 표현식 및ed인쇄 결과 - 명령의 문자 입니다 g/re/p. GNU 사람들은 grep파일을 찾을 수 있는 옵션을 제공하여 정말 망쳤습니다. 바라건대 그들은 sort, tr, sed, wc 등을 사용할 계획이 없기를 바랍니다!

다음은 원하는 작업을 수행하는 강력한 방법입니다(언제, 패턴의 의미, 패턴에 포함될 수 있는 문자 등을 증가시키길 원한다고 가정).

i=0
while IFS= read -rd '' file; do
    grep -q 'pattern' "$file" &&
    sed -i 's/pattern*/pattern'"$i"'/g' "$file"
    ((i++))
done < <(find '/parent/sub/' -type f -print0)

관련 정보