我有一个文件多次出现表达式“.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 -i
或perl -i
)的程序都会执行此操作。在大多数情况下,这很好,因为它由与原始文件所有者具有相同 umask 的同一用户运行,并且很少有文件具有多个硬链接。
或者
cat new.txt > orig.txt
rm new.txt
这将用 的orig.txt
内容覆盖 的内容new.txt
,然后删除new.txt
。 orig.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