[英]how to replace multiple lines using bash?
我有一个包含数千行的文件。 我正在寻找帮助来修改我选择的多行。
Package: com.xyz.abc
Version: 1.0
Filename: ./debs/abc.deb
Package: com.xyz.def
Version: 1.0.0-1
Filename: ./debs/def.deb
我需要一个bash命令来检测“Filename”,然后将它们更改为:
Package: com.xyz.abc
Version: 1.0
Filename: ./debs/download.php?p=abc
Package: com.xyz.def
Version: 1.0.0-1
Filename: ./debs/download.php?p=def
它将循环直到所有“文件名”都被更改。
这是sed
的工作! 来自GNU sed主页:
Sed通常用于使用模式匹配来提取文件的一部分或者在文件中替换多次出现的字符串。
您可以这样做:
sed '/^Filename:/s!\(./debs/\)\(.*\).deb!\1download.php?p=\2!' /path/to/input > /path/to/output
哪里:
/^Filename:/
查找以( ^
)文本'Filename:'开头的行 s!search!replace!
将'search'替换为'replace',其中'search'是正则表达式 \\1
是第一个匹配组“ \\(...\\)
”捕获的字符串 \\2
是第二个匹配组“ \\(...\\)
”捕获的字符串 示范:
$ echo 'Package: com.xyz.abc
Version: 1.0
Filename: ./debs/abc.deb
Package: com.xyz.def
Version: 1.0.0-1
Filename: ./debs/def.deb' | sed '/^Filename:/s!\(./debs/\)\(.*\).deb!\1download.php?p=\2!'
Package: com.xyz.abc
Version: 1.0
Filename: ./debs/download.php?p=abc
Package: com.xyz.def
Version: 1.0.0-1
Filename: ./debs/download.php?p=def
有关调整此内容以及编写自己的sed
脚本,请参阅在线文档 。
这是一个解决方案:
perl -pi -e '/^Filename:/ and s,debs/([^.]+)\.deb\s*$,debs/download.php?p=$1,' thefile
首先尝试它,不要把它与i
选项和管道用less
。 然后重新添加i
。
不是在bash本身,而是:
sed 's#Filename: \./debs/\(.*\)\.deb#Filename: ./debs/download.php?p=\1#' < the_file
您正在寻找一个名为sed
的工具:
sed -e "s|^(Filename: ./debs/)(.+).deb|\1download.php?p=\2|" < yourfile
以下是awk
和sed
改进答案。
与其他答案不同,这些工作与“文件名:”路径无关。 也就是说,如果你将'./debs/'更改为'./myDebs/',它仍然有效。 他们所需要的只是'.deb'文件位于路径的末尾
sed '/Filename:/s|^\(.*/\)\([^\.]*\)\..*$|\1download.php?p=\2|' ./infile
awk -F'/' '/Filename:/{split($NF,a,".");$NF="download.php?p=" a[1]}1' OFS='/' ./infile
$ cat ./infile
Package: com.xyz.abc
Version: 1.0
Filename: ./debs/abc.deb
Package: com.xyz.def
Version: 1.0.0-1
Filename: ./MyDebs/def.deb
$ sed '/Filename:/s|^\(.*/\)\([^\.]*\)\..*$|\1download.php?p=\2|' ./infile
Package: com.xyz.abc
Version: 1.0
Filename: ./debs/download.php?p=abc
Package: com.xyz.def
Version: 1.0.0-1
Filename: ./MyDebs/download.php?p=def
$ awk -F'/' '/Filename:/{split($NF,a,".");$NF="download.php?p=" a[1]}1' OFS='/' ./infile
Package: com.xyz.abc
Version: 1.0
Filename: ./debs/download.php?p=abc
Package: com.xyz.def
Version: 1.0.0-1
Filename: ./MyDebs/download.php?p=def
这可能对你有用:
sed '/^Filename:/s/\([^/]*\)\.[^.]*$/download.php?p=\1/' file
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.