我有一个数千行的文件。 我在寻找帮助来修改我要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
这里用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