내 코드베이스에는 다음 줄이 있습니다.
@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