我在这里使用awk而不是grep。文件pkg.conf具有'ssl_cipher'字符串,我需要将包含ssl_cipher的行复制到另一个文件'pkg.conf.new',且行号相同(此处为pkg.conf中的20):
PHP >= 7.1.3
OpenSSL PHP Extension
PDO PHP Extension
Mbstring PHP Extension
Tokenizer PHP Extension
XML PHP Extension
Ctype PHP Extension
JSON PHP Extension
是不是只有一个班轮来做这件事,还是应该寻求“ sed”的帮助?
答案 0 :(得分:2)
您可以使用以下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
。
答案 1 :(得分:0)
您可以使用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
则用于删除,以删除该行的原始内容。