GNU sed는 n번째 발생 시 작업을 수행하지 않습니다.

GNU sed는 n번째 발생 시 작업을 수행하지 않습니다.

Fedora RPM(dnf)을 통해 sed

사전 간격에 대한 트랙을 추가하려면 큐 파일의 트랙을 진행해야 합니다. (TRACK 00은 더 이상 shnsplit에서 작동하지 않습니다.) 스크립트가 작동하지 않을 때는 명령줄을 사용했습니다.

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

정확히 내가 원했던 것입니다. 이제 트랙 01은 트랙 02입니다. 그러나 이제 파일에는 두 개의 트랙 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"라는 문자열이 두 번(또는 더 자주) 포함되어 있는 경우 두 번째로 나타나는 문자열을 "TRACK 03"으로 변경합니다.. 이와 같이:

트랙 02트랙 02트랙 02 트랙 02 [...] ==>
트랙 02트랙 03트랙 02 트랙 02 [...]

또한 정규식(또는 기본일반 구문정의에 따르면 컨텍스트가 없습니다. 따라서 수행할 수 있는 작업에는 몇 가지 제한이 있습니다. 더 많은 정보를 알고 싶다면이것초보자로서 관심이 있다면 더 심층적인 분석을 위해 "Dragon book"(컴파일러: 원리, 기술 및 도구(Aho, Sethi 및 Ullman 저))을 읽어 보시기 바랍니다.

당신이 알아야 할 또 다른 것은 sed가 작동하는 방식입니다. 변경하려는 텍스트의 첫 번째 줄을 읽은 다음 첫 번째 명령, 결과에 따라 두 번째 명령 등을 마지막 명령에 도달할 때까지 적용합니다. -n 옵션을 사용하지 않으면 결과가 인쇄되고, 다음 줄을 읽고, 첫 번째 명령이 적용되는 식으로 마지막 명령이 마지막 줄의 두 번째 명령 결과에 적용될 때까지 계속됩니다. - 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

관련 정보