如何用bashreplace多行?

我有一个数千行的文件。 我在寻找帮助来修改我要select的多行。

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命令来检测“文件名”然后改变他们是这样的:

 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:/查找以( ^ )文本“文件名:”开始的行
  • s!search!replace! 用'replace'代替'search',其中'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 

这里用awksed改进了答案。

与其他答案不同,这些工作独立于“文件名:”路径。 也就是说,如果将“./debs/”更改为“./myDebs/”,它仍然有效。 他们所需要的就是'.deb'文件在路径的末尾

桑达

 sed '/Filename:/s|^\(.*/\)\([^\.]*\)\..*$|\1download.php?p=\2|' ./infile 

AWK

 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输出

 $ 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输出

 $ 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