Ubuntu 18ビルド
in[define( 'AUTH_KEY',]
なしでこのテキストを見つけて、その行をコピーしてから同じ行を置き換えようとします。私はいくつかのオプションを試しましたが、成功しませんでした。[]
/var/www/file1.txt
/var/www/file2.php
sed
awk
awk '/"define\( 'AUTH_KEY',"/' /var/www/file1.txt > /var/www/file2.php
sed -i 's/"define\( 'AUTH_KEY',"/' /var/www/file1.txt >> /var/www/file2.php
file1.txt
行が含まれています
define('AUTH_KEY', '{++X!upib~T.#C.&ykXDQpQ<nyrD7jadfu*adk^);
file2.php
行が含まれています
define( 'AUTH_KEY', 'put your unique phrase here' );
file1.txt
から同じ行を置き換えるには、from行が必要ですfile2.php
。
答え1
awk '
/define\([ \t]*\047AUTH_KEY\047,/{
if (FNR==NR){ line=$0 }
else{ $0=line }
}
FNR!=NR
' /var/www/file1.txt /var/www/file2.php > /var/www/file2.php.new
mv /var/www/file2.php.new /var/www/file2.php
角かっこ式は、[ \t]
スペースまたはタブ文字とパターンと*
ゼロ回以上一致します。
\047
8進数の単一引用符です'
。
最初のファイルが処理されると、一致するレコードが変数に保存されますline
。 2番目のファイルが処理されると、一致するレコードがline
。
FNR!=NR
2番目のファイルの履歴を印刷します。
答え2
これはオプションです。
# save the AUTH_KEY into a variable
$ key=$(awk -F"'" '/AUTH_KEY/ { print $4 }' file1.txt)
# use the variable to replace the same value in the other file
$ awk -F"'" -v val="'${key//\\/\\\\}'" 'BEGIN { OFS="" } $4 = val,$2 = "'\''"$2"'\''"' file2.php
$ cat file2.php | grep AUTH_KEY
define( 'AUTH_KEY', '{++X!upib~T.#C.&ykXDQpQ<nyrD7jadfu*adk^' );
答え3
base='/var/www'
tmpf=$(mktemp)
f1="$base/file1.txt"
f2="$base/file2.php"
ws='[[:blank:]]\{1,\}'
re_bre="define[(]$ws'AUTH_KEY'"
sed -e "/$re_bre/q;d" "$f1" |
sed -e "1h;/$re_bre/g;1d" - "$f2" > "$tmpf" &&
mv -f -- "$tmpf" "$f2"