GNU sedはn回目の発生時に操作を実行しません。

GNU sedはn回目の発生時に操作を実行しません。

Fedora RPM(dnf)経由でsed

事前間隔のトラックを追加するには、キューファイルのトラックを続行する必要があります。 (TRACK 00はshnsplitでは機能しなくなりました。)スクリプトが機能しないときはコマンドラインを使用しました。

sed -i 's/TRACK 01/TRACK 02/' *cue

まさに私が望んでいたものです。今、トラック01はトラック02です。ただし、ファイルには2つのトラック02があります。

sed -i 's/TRACK 02/TRACK 03/2' *cue

何もしないでください。 「TRACK 02 AUDIO」のリストは2つだけ残りました。

ここに画像の説明を入力してください。

答え1

使用幸せ(以前のPerl_6)

RakuはPerlプログラミング言語シリーズのプログラミング言語です。 、、など:nth()で書くことができるRakuの読みやすい正規表現修飾子を強調するためにこの回答を投稿しています。:1st:2nd:3rd:4th

使用S///演算子:

~$ raku -e 'given slurp() { put S:nth(6)/ line /|*-> line <-*|/ };'  file

#OR

~$ raku -e 'given slurp() { put S:6th/ line /|*-> line <-*|/ };'  file

使用subst()演算子:

~$ raku -e 'put slurp.subst: :nth(6), /line/, "|*-> line <-*|";'  file 

#OR

~$ raku -e 'put slurp.subst: :6th, /line/, "|*-> line <-*|";'  file

入力例:

1st line Doc
2nd line Sneezy
3rd line Grumpy
4th line Happy
5th line Bashful
6th line Sleepy
7th line Dopey

出力例(すべてのコード例):

1st line Doc
2nd line Sneezy
3rd line Grumpy
4th line Happy
5th line Bashful
6th |*-> line <-*| Sleepy
7th line Dopey

https://docs.raku.org/言語/regexes#Positional_adverbs
https://docs.raku.org/routine/subst
https://raku.org

答え2

解決策を試す前に、まず問題を分析してみましょう。これはあなたの命令です:

sed -i 's/TRACK 02/TRACK 03/2' *cue

sed の -i オプションは使用されません。しかし、これはマイナーな問題です。sed専用ワイヤー、テキストや「TRACK 02」などの正規表現を含むファイル記述の代わりにワイヤー、いいえ文書。あなたのコマンドは次のとおりです

行に「TRACK 02」という文字列が2回(またはより頻繁に)含まれている場合は、2番目に表示される文字列を「TRACK 03」に変更します。。このように:

トラック02トラック02トラック02トラック02 [...] ==>
トラック02トラック03トラック02トラック02 [...]

また、正規表現(または基本一般的な構文定義によると、コンテキストはありません。したがって、実行できる操作にはいくつかの制限があります。より多くの情報を知りたい場合これ初心者として興味がある場合は、より詳細な分析のために「Dragon book」(コンパイラ:原理、技術、ツール(Aho、Sethi、Ullman))をお読みください。

あなたが知っておくべきもう一つのことは、sedがどのように機能するかです。変更したいテキストの最初の行を読み取り、最初のコマンド、結果に応じて2番目のコマンドなどを最後のコマンドに達するまで適用します。 -n オプションを使用しない場合、結果が出力され、次の行が読み取られ、最後のコマンドが最後の行の 2 番目のコマンドの結果に適用されるまで、最初のコマンドが適用されるように続行されます。 - sed 停止します。

これがあなたがこれを行うことができない理由です:

s/TRACK 00/TRACK 01/
s/TRACK 01/TRACK 02/
s/TRACK 02/TRACK 03/
s/TRACK 03/TRACK 04/

これは、「00」を「01」に変更し、次のコマンドは、「01」を「02」に、次の「02」を「03」に変更することで続く。最後に、すべての行に「TRACK 04」(または希望のリストの長さ)が表示されます。

ただし、逆に変更することはできます(タイトルが10を超える場合は、始めに同様の行を追加してください)。これにより、事前間隔TRACK 01を自動的に追加することもできます。

sed 's/TRACK 09/TRACK 10/
     s/TRACK 08/TRACK 09/
     s/TRACK 07/TRACK 08/
     s/TRACK 06/TRACK 07/
     s/TRACK 05/TRACK 06/
     s/TRACK 04/TRACK 05/
     s/TRACK 03/TRACK 04/
     s/TRACK 02/TRACK 03/
     s/TRACK 01/TRACK 02/
     /FILE/ { a\
TRACK 01
a\
addtional optional text under TRACK 01
        }' /path/to/file
          

最後に、このsedスクリプトを使用して大規模な変更を実行する方法の提案は次のとおりです。元のファイルはそのままにして、変更されたファイルを別のディレクトリに配置します。もし(〜しない限り)結果を確認し、結果に満足し、元の結果を上書きして再度コピーしました。

for fWork in "*cue" ; do
     sed 'the script from above' "$fWork" > "/other/path/$fWork"
done

今、結果を確認しに行ってみてください。あなたが好きなら:

mv /other/path/*cur /original/path

関連情報