在一个文件中查找文本并替换为另一文件 SED 或 AWK 中的文本

在一个文件中查找文本并替换为另一文件 SED 或 AWK 中的文本

Ubuntu 18 构建

我试图[define( 'AUTH_KEY',]在没有[]in 的情况下找到此文本/var/www/file1.txt,然后复制该行并替换 中的同一行/var/www/file2.php。我尝试了多种选择,sedawk都没有成功。

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' );

我需要 from 的行file1.txt来替换 中的同一行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是一个八进制单引号'

当处理第一个文件时,将匹配的记录保存在变量中line。当处理第二个文件时,将匹配的记录替换为 的内容line

FNR!=NR打印第二个文件的记录。

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

相关内容