私のファイルで、次のすべてのインスタンスの場所を置き換える必要があります。
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
2番目の質問については
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 ''`