将匹配的出现编号放置在出现本身的左侧

将匹配的出现编号放置在出现本身的左侧

我有一个文件多次出现表达式“.mp3”。我希望第一次出现成为“1.mp3”,第二次出现成为“2.mp3”,依此类推。

它会类似于 awk '/mp3/NR' 文件

我的文件:

line 1
wget .mp3 url
line 2
wget .mp3

....

我还没有得到任何结果

答案1

$ awk -v i=1 '/ \.mp3/ {sub(/ \.mp3/," "i++".mp3",$0)};1' input.txt
line 1
wget 1.mp3 url
line 2
wget 2.mp3

如果 wget URL 中的数字要以零填充,则可以使用 awksprintf()进行带前导零的格式化i。例如:

$ awk -v i=1 '/ \.mp3/ {sub(/ \.mp3/," "sprintf("%03i",i++)".mp3",$0)};1' input.txt
line 1
wget 001.mp3 url
line 2
wget 002.mp3

您还可以sprintf()wget-O( --output-document) 选项结合使用以零填充的文件名保存下载的文件,以便它们正确排序(例如 01,02,03,...10 而不是 1,10,2,3,... )

$ awk -v i=1 '/ \.mp3/ {sub(/ \.mp3/," "i".mp3 -O "sprintf("%03i",i++)".mp3",$0)};1' input.txt
line 1
wget 1.mp3 -O 001.mp3 url
line 2
wget 2.mp3 -O 002.mp3

所有上述单行代码都会输出到标准输出。要覆盖原始文件,请重定向到新文件,然后mv覆盖原始文件。

awk -v i=1 '/ \.mp3/ {sub(/ \.mp3/," "i++".mp3",$0)};1' orig.txt > new.txt

然后:

mv new.txt orig.txt

这将替换orig.txt为使用当前值指定的权限创建的新文件umask。它也可能有一个新的所有者和/或组(取决于运行它的人以及他们的默认组是什么)。它还将有一个新的索引节点号,破坏任何可能存在的硬链接。

大多数具有“就地编辑”选项(例如sed -iperl -i)的程序都会执行此操作。在大多数情况下,这很好,因为它由与原始文件所有者具有相同 umask 的同一用户运行,并且很少有文件具有多个硬链接。

或者

cat new.txt > orig.txt
rm new.txt

这将用 的orig.txt内容覆盖 的内容new.txt,然后删除new.txtorig.txt将具有与之前相同的 inode、所有者、组和权限。

答案2

尝试这个,

i=1;
while [ "$( grep -o ' .mp3' file)" != "" ];
do
 sed -i "0,/ .mp3/ s/ .mp3/ $i.mp3/" file
 i=`expr $i + 1`;
done

相关内容