一致する発生番号を発生自体の左側に配置します。

一致する発生番号を発生自体の左側に配置します。

「.mp3」という表現が複数回出現するファイルがあります。最初のアイテムは「1.mp3」で、2番目のアイテムは「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の数字を0で埋めるには、awkを使用してsprintf()前に0を使用して書式設定できます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()と組み合わせて、ダウンロードしたファイルをゼロで埋められたファイル名で保存して正しくソートすることもできます(例:1,10,2,3,..の代わりに01,02,03,...10)。 .)wget-O--output-document

$ 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。また、新しい所有者および/またはグループが存在する可能性があります(誰が実行し、デフォルトグループが何であるかによって異なります)。また、存在する可能性のあるハードリンクを破る新しいinode番号があります。

「場所で編集」オプション(たとえば、sed -iまたはperl -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

関連情報