내 파일에서 다음의 모든 인스턴스 위치를 바꿔야 합니다.
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 ''`