Ubuntu 18 构建
我试图[define( 'AUTH_KEY',]
在没有[]
in 的情况下找到此文本/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' );
我需要 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"