我认为它会使用sed, regex进行替换,并选择下一行的版本和追加,等等。
输入文件
name: abc.def
version: 1.0.0
输出文件
name: abc-def-1.0.0.tar.gz
version: 1.0.0
如果ed
可用/可接受,那么给定您的输入文件应该这样做。
脚本命名为script.ed
(根据自己的意愿命名)
2t.
2s/^version: *//
s/$/.tar.gz/
1s/$/-/
s/./-/
.,2j
%p
Q
然后对文件运行它。假设文件名为file.txt
ed -s file.txt < script.ed
如果您对输出满意或者需要就地编辑,请将
Q
更改为w
。去掉
%p
使输出静音
简短说明。除%p
、Q
外,其他命令逐行执行
2t.
表示复制或复制文件中的第2行。输出为:
name: abc.def
version: 1.0.0
version: 1.0.0
2s/^version: *//
从第2行删除前导字符串version:
和它后面的任何数量的空间。输出为:
name: abc.def
1.0.0
version: 1.0.0
s/$/.tar.gz/
在同一行缓冲区,即文件中的第2行。在末尾添加字符串.tar.gz
。输出为:
name: abc.def
1.0.0.tar.gz
version: 1.0.0
1s/$/-/
在文件的第1行添加一个末尾的破折号-
。输出:
name: abc.def-
1.0.0.tar.gz
version: 1.0.0
s/./-
在同一行(第一行)替换/更改点.
为破折号-
。输出:
name: abc-def-
1.0.0.tar.gz
version: 1.0.0
.,2j
在同一行(第一行)点.
表示当前行,2
将它们连接在一起。j
命令就是这样做的。最终输出为:
name: abc-def-1.0.0.tar.gz
version: 1.0.0
:
GNU ed
POSIX ed- ed <<li> p>
pdf格式
MirBSD ed
bash hackers wiki ed
也是你本地的手册页。
man 1p ed
cat file
name: abc.def
version: 1.0.0
您可以使用awk
创建包含版本号的变量,并将其替换为for loop
sed
命令。for f in file; do
ver=$(awk '/version/ {print $2}' $f);
sed -Ei "/name/ {s/(S+).(S+)/1-2-$ver.tar.gz/}" $f;
done
cat file
name: abc-def-1.0.0.tar.gz
version: 1.0.0
perl -i.bak -lne 'if (/name: (.*)/) { ($name = $1) =~ y/./-/ } elsif (/version: (.*)/) {
$version = $1; print "name: $name-$version.tar.gzn$_" } else { print }' infiles