ファイル内でテキストを置き換える方法

ファイル内でテキストを置き換える方法

私のファイルで、次のすべてのインスタンスの場所を置き換える必要があります。

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 ''`

関連情報