Unix命令或bash脚本转换abc.def文件到abc-def-1.0.0.tar.gz?



我认为它会使用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使输出静音


简短说明。除%pQ外,其他命令逐行执行

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

相关内容

最新更新