あるファイル内のテキストを見つけ、別のファイルSEDまたはAWKのテキストに置き換えます。

あるファイル内のテキストを見つけ、別のファイルSEDまたはAWKのテキストに置き換えます。

Ubuntu 18ビルド

in[define( 'AUTH_KEY',]なしでこのテキストを見つけて、その行をコピーしてから同じ行を置き換えようとします。私はいくつかのオプションを試しましたが、成功しませんでした。[]/var/www/file1.txt/var/www/file2.phpsedawk

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]スペースまたはタブ文字とパターンと*ゼロ回以上一致します。 \0478進数の単一引用符です'

最初のファイルが処理されると、一致するレコードが変数に保存されますline。 2番目のファイルが処理されると、一致するレコードがline

FNR!=NR2番目のファイルの履歴を印刷します。

答え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"

関連情報