파일 내에서 텍스트를 바꾸는 방법

파일 내에서 텍스트를 바꾸는 방법

내 파일에서 다음의 모든 인스턴스 위치를 바꿔야 합니다.

grep 'search string'

그리고

sed '/string of text/,/string of text/{//!d}'

VI에서 정규식을 시도했지만 성공하지 못했습니다. 후행 문자에 대한 내용이 나와 있었습니다.

:%s/grep 'search string'/sed '/string of text/,/string of text/{//!d}'/g

또한 파일 외부에서 sed를 사용해 보았습니다. 이벤트를 찾을 수 없습니다.

sed -i 's/grep 'search string'/sed '/search string/,/search string/{//!d}'/g' filename. 

내가 뭘 잘못하고 있고 어떻게 작동하게 할 수 있나요? 변경해야 할 인스턴스가 너무 많아서 이 작업을 수동으로 수행하는 것은 옵션이 아닙니다.

다음 코드 줄을 변경하고 싶습니다.

succ_1st=`grep 'resulted in successful answer' $path_tmp/named.stats.tmp | sed '/localhost.localdomain/,/testdns.net/{//!d}' | awk '{ print $1 }' | grep -m1 ''`

이와 관련하여:

succ_1st=`sed '/localhost.localdomain/,/testdns.net/{//!d}' $path_tmp/named.stats.tmp | grep 'resulted in successful answer' | awk '{ print $1 }' | grep -m1 ''`

그건 그렇고, 이것은 스크립트의 코드 줄입니다.

답변1

첫 번째 질문에 대해

이 명령이 작동하려면 구분 기호를 변경하는 것이 도움이 됩니다. 또한 sed 명령의 작은따옴표는 셸에서 보호하기 위해 올바르게 이스케이프되어야 합니다.

sed  's|grep '\''search string'\''|sed '\''/search string/,/search string/{//!d}'\''|g' file

예를 들어 다음 테스트 파일을 사용합니다.

$ cat file
grep 'search string'

위 명령은 다음을 생성합니다.

$ sed  's|grep '\''search string'\''|sed '\''/search string/,/search string/{//!d}'\''|g' file
sed '/search string/,/search string/{//!d}'

파일을 변경하려면 플래그를 추가하십시오 -i.

sed -i 's|grep '\''search string'\''|sed '\''/search string/,/search string/{//!d}'\''|g' file

두 번째 질문에 대해서는

sed -r 's/(grep[^$]*)([$][^|]*)[|] (sed[^|]*)/\3\2| \1/' filename

예를 들어 다음 테스트 파일을 고려해보세요.

$ cat filename
succ_1st=`grep 'resulted in successful answer' $path_tmp/named.stats.tmp | sed '/localhost.localdomain/,/testdns.net/{//!d}' | awk '{ print $1 }' | grep -m1 ''`

이 명령은 다음을 생성합니다.

$ sed -r 's/(grep[^$]*)([$][^|]*)[|] (sed[^|]*)/\3\2| \1/' filename
succ_1st=`sed '/localhost.localdomain/,/testdns.net/{//!d}' $path_tmp/named.stats.tmp | grep 'resulted in successful answer' | awk '{ print $1 }' | grep -m1 ''`

파일을 제자리에서 변경하려면 플래그를 추가하세요 -i.

sed -ir 's/(grep[^$]*)([$][^|]*)[|] (sed[^|]*)/\3\2| \1/' filename

Vi 명령

위의 첫 번째 명령은 vim에서 실행할 수 있습니다.

%s/grep 'search string'/sed '\/search string\/,\/search string\/{\/\/!d}'/g

swap 명령은 vim에서 실행할 수 있습니다.

%s/\v(grep[^$]*)([$][^|]*)[|] (sed[^|]*)/\3\2| \1/

답변2

sed가 아니고 주로 bash입니다:

string=$(cat <<'END'
succ_1st=`grep 'resulted in successful answer' $path_tmp/named.stats.tmp | sed '/localhost.localdomain/,/testdns.net/{//!d}' | awk '{ print $1 }' | grep -m1 ''`
END
)

var=$(cut -d'`' -f1 <<<"$string")
code=$(cut -d'`' -f2 <<<"$string")
IFS='|' read -ra commands <<<"$code"
filename=$( set -f; eval set -- "${commands[0]}"; echo ${!#} )  # danger
tmp=${commands[0]//${filename//\//\\\/}/}
commands[0]="${commands[1]} $filename"
commands[1]=$tmp
printf -v new '%s`%s`' "$var" "$(IFS='|'; echo "${commands[*]}")"
echo "$new"
succ_1st=` sed '/localhost.localdomain/,/testdns.net/{//!d}'  $path_tmp/named.stats.tmp|grep 'resulted in successful answer'  | awk '{ print $1 }' | grep -m1 ''`

관련 정보