디렉토리의 모든 파일에서 문자열의 일부를 찾아 바꾸기

디렉토리의 모든 파일에서 문자열의 일부를 찾아 바꾸기

내 코드베이스에는 다음 줄이 있습니다.

@driver.find_element(:link, "Create").click

때로는 "(" 및 ")" 안에 문자열이 있을 수 있습니다.

예를 들어:@driver.find_element(:name, from_email).click

라인을 바꾸고 싶어요

@driver.find_element(:link, "Create").click

그리고

@driver.find_element(:name, from_email).click

~처럼

click(:link, "Create")

그리고

click(:name, from_email)

@driver.find_element나는 대괄호와 대괄호 안의 단어를 유지하기 위해 교체를 원합니다 click.

다양한 폴더 수준의 파일 간에 이 작업을 수행할 수 있는 방법이 있습니까?

답변1

디렉터리의 모든 파일에서 문자열 일부 바꾸기

찾다+sed해결책:

find yourfolder -type f -print0 \
    | xargs -0 sed -i.bak -E 's/@driver\.find_element\(([^()]+)\)\.click/click(\1)/'

답변2

사용 sed:

sed 's/@driver.find_element\((:name, from_email)\).click/click\1/;s/@driver.find_element\((:link, "Create")\).click/click\1/'

예:
이전 파일:

cat clickReplace 
@driver.find_element(:link, "Create").click
@driver.find_element(:name, from_email).click
@driver.find_element(:name, foobar).click
@driver.find_element(:link, foobar).click

이후 파일:

sed 's/@driver.find_element\((:name, from_email)\).click/click\1/;s/@driver.find_element\((:link, "Create")\).click/click\1/' clickReplace 
click(:link, "Create")
click(:name, from_email)
@driver.find_element(:name, foobar).click
@driver.find_element(:link, foobar).click

sed -i파일을 "제자리"로 변경하는 데 사용됩니다 .

이 작업을 반복적으로 수행하려면 find파일이 있는 파일 시스템의 위치를 ​​사용하십시오. 예를 들어:

find /path/to/files/ -type f -exec \
sed -i 's/@driver.find_element\((:name, from_email)\).click/click\1/;s/@driver.find_element\((:link, "Create")\).click/click\1/' {} +

답변3

확장된 정규식 지원(-r 또는 -E)과 함께 sed를 사용하십시오.

$ sed -E 's/.*(\(.*\))[.](.*)/\2\1/g' <<<$'@driver.find_element(:link, "Create").click'
click(:link, "Create")

$ sed -E 's/.*(\(.*\))[.](.*)/\2\1/g' <<<$'@driver.find_element(:name, from_email).click'
click(:name, from_email)

클래식 sed, 기본 정규식:

$ sed 's/.*\((.*)\)[.]\(.*\)/\2\1/g' <<<$'@driver.find_element(:link, "Create").click'
click(:link, "Create")

awk를 사용하세요:

$ awk -F'[.(]' '{print $NF "(" $(NF-1)}' <<<$'@driver.find_element(:name, from_email).click'    
click(:name, from_email)

답변4

주어진하나의파일이 있는 경우 다음 sed명령이 파일을 대체합니다.

sed 's/@driver.find_element(\(.*\)).click/click(\1)/' file >file.tmp && 
mv file.tmp file

우리는 파일 계층 구조에서 모든 파일을 찾고 모든 파일에 대해 실행하려고 합니다.

find . -type f \
    -exec sh -c \
    'for n; do
        sed "s/@driver.find_element(\(.*\)).click/click(\1)/" "$n" >"$n.tmp" &&
        mv "$n.tmp" "$n"
    done' sh {} +

예를 들어 특정 이름의 파일 *.js만 수정하려면 .-name '*.js'-exec

이는 .tmp파일 이름 끝에 추가해도 실수로 기존 파일을 덮어쓰지 않는다고 가정합니다.


sed -i구현 -i간 이식이 불가능하기 때문에 의도적으로 사용하지 않습니다 .sed

관련 정보