我在这里使用了awk,而不是grep。文件 pkg.conf 有 'ssl_cipher' 字符串,我需要将包含 ssl_cipher 的行复制到另一个文件'pkg.conf.new' 的行号相同(这里是 pkg.conf 中的 20
(:bash-4.2$ awk '/ssl_cipher/ {print FNR,$(NF-1),$NF}' pkg.conf
20 ssl_cipher 'ECDHJES128:ECDH+AESGCM:ECDH+AES256:DH+AES:DH+AESGCM:DH+AES256:RSA+AES :RSA+AESGCMHaNULL:!RC4:!MD5:!DSS:!3DESHSSLv3');
是否有一个尴尬的衬里来做到这一点,或者我应该寻求"sed"的帮助?
您可以使用此 awk 脚本:
awk 'NR==FNR{ # On the first file
if(/ssl_cipher/){ # lookup the string
line_content=$0; # store the content
line_no=NR # and line number
};
next # skip other files
}
FNR==line_no{ # On the second file, at the wanted line
print line_content # append the wanted content
}1 # print the other lines
' pkg.conf pkg-new.conf
请注意,这将插入一个新行。正如@Yoric所提到的,如果要替换该行,则next
关键字在print line_content
之后。
结果是输出到标准输出。如果你想替换pkg-new.conf
文件,如果你有GNU awk,你可以将选项-i inplace
添加到命令行。
您可以使用 sed 生成 sed 脚本:
awk '/ssl_cipher/ {print FNR,$(NF-1),$NF}' pkg.conf
| sed 's/ /{i/;s/$/nd}/'
| sed -f- pkg.conf.new
第一个 sed 脚本会将输出转换为
20{issl_cipher 'ECDHJES128:ECDH+AESGCM:ECDH+AES256:DH+AES:DH+AESGCM:DH+AES256:RSA+AES :RSA+AESGCMHaNULL:!RC4:!MD5:!DSS:!3DESHSSLv3');
d}
它告诉 sed 特别处理第 20 行:i
用于插入,d
用于删除,从而删除该行的原始内容。