sed를 사용하여 줄의 첫 번째 ";"를 문자열로 바꾸고 두 번째 ";"를 다른 문자열로 바꿉니다.

sed를 사용하여 줄의 첫 번째 ";"를 문자열로 바꾸고 두 번째 ";"를 다른 문자열로 바꿉니다.

다음 형식의 세미콜론으로 구분된 재생 목록이 있습니다.

Thåström ; Stjärna som är din ; Skebokvarnsv. 209

;첫 번째 항목을 대시(-)로 바꾸고 ;두 번째 항목을 "- Album: " 문자열로 바꾸고 싶습니다 .

다음 구성을 시도하고 있지만 올바르지 않습니다. sed 's/\;/\-/1;s/\;/\-\ Album\:/2'

부울 결과는 다음과 같습니다.

Thåström - Stjärna som är din ; Skebokvarnsv. 209

첫 번째 단락에 잘못된 부분이 있다는 것을 알고 있습니다. 왜냐하면 다음을 실행하면 sed 's/\;/\-\ "Album\:"/2'줄 끝에서 올바른 결과를 얻을 수 있기 때문입니다.

Thåström ; Stjärna som är din - Album: Skebokvarnsv. 209

어떤 도움이라도 대단히 감사하겠습니다!

답변1

저는 MacOS 13.5.2의 일반 "sed"에서 이것을 실행하고 있습니다.

나는 당신이 원하는 것을 얻는 데 매우 가깝다고 생각합니다. 내가 채택한 구성은 명령줄에 지정된 두 가지 표현식만 사용합니다. -f <command_file>원하는 경우 파일에 넣고 옵션을 사용할 수도 있습니다.

sed -e 's/;/-/' -e 's/;/- Album:/'

첫 번째 표현식은 해당 줄의 첫 번째 세미콜론으로 대체됩니다. 두 번째 표현식은 다음 표현식을 변경합니다. 순차적으로 처리되기 때문에 예제처럼 마지막에 숫자 플래그를 지정하는 것에 대해 걱정할 필요가 없습니다.

출력 예를 구분하려면 추가 빈 줄을 사용하십시오.

echo 'Thåström ; Stjärna som är din ; Skebokvarnsv. 209' \
| sed -e 's/;/-/' -e 's/;/- Album:/' 

Thåström - Stjärna som är din - Album: Skebokvarnsv. 209

예상 도착 시간:원래 예에서 두 번째 표현식에는 2플래그가 있습니다. 이것 은 두 번째 것을 대체할 것입 니다 ;. 그러나 첫 번째 교체가 첫 번째 교체를 수행 ;하므로 명령이 교체를 시도합니다.제삼 ;온라인. 그냥 놓으면 2예상대로 작동할 것입니다.

답변2

사용 gawk:

$ awk '{ sub(/;/,"-"); sub(/;/, "- Album:")}1' file       

$ awk '{ print gensub(/(^[^;]*);([^;]*);(.*)/, "\\1-\\2- Album:\\3", g);}' file

동일한 패턴을 다른 문자열로 여러 번 바꾸려면 다음 방법을 사용할 수 있습니다.

$ awk 'BEGIN{ar[1]="-"; ar[2]="- Album:";}{r=$0; for(i=1;i<=length(ar);i++) r=gensub(/;/, ar[i], 1, r); print r}' file

답변3

사용행복하다(이전 Perl_6)

~$ raku -ne 'S/ \; /-/ andthen S/ \; /- Album:/.put;'  file

Raku는 Perl 프로그래밍 언어 계열의 프로그래밍 언어입니다. 위에서는 -ne자동 인쇄가 아닌 한 줄씩 명령줄 플래그를 사용 하고 단순히 두 번의 연속 S///대체를 수행한 다음 out 을 수행했습니다 put. 이 put호출은 줄 끝에 개행 문자를 추가합니다.

입력 예:

Thåström ; Stjärna som är din ; Skebokvarnsv. 209

예제 출력:

Thåström - Stjärna som är din - Album: Skebokvarnsv. 209

이것매우 좋은Raku의 한 가지 측면은 유니코드를 지원한다는 것입니다. 따라서 유니코드 특성을 사용하여 텍스트를 필터링 및/또는 바꿀 수 있습니다.

~$ raku -ne 'S/ \; /-/ andthen S/ \; /- Album:/ andthen S/ <:Script<Runic>>+ /⁒/.put;'  

입력 예:

16F1 ᛱ Thåström ; Stjärna som är din ; Skebokvarnsv. 209
16F2 ᛲ Thåström ; Stjärna som är din ; Skebokvarnsv. 209
16F3 ᛳ Thåström ; Stjärna som är din ; Skebokvarnsv. 209

예제 출력:

16F1 ⁒ Thåström - Stjärna som är din - Album: Skebokvarnsv. 209
16F2 ⁒ Thåström - Stjärna som är din - Album: Skebokvarnsv. 209
16F3 ⁒ Thåström - Stjärna som är din - Album: Skebokvarnsv. 209

위의 예시 입력에는 세 개의 룬 문자가 삽입되어 있습니다. Raku 정규 표현식은 다음을 기반으로 문자를 식별 및/또는 필터링할 수 있습니다.유니코드 스크립트지정됩니다(이 경우 <:Script<Runic>>). 룬 문자는 유니코드 "상업용 빼기"(U+2052) 로 올바르게 대체되지만 StackOverflow에서는 이를 표시할 수 없는 것 같습니다.

https://www.unicode.org/charts/PDF/U16A0.pdf
https://docs.raku.org/언어/regexes
https://raku.org

답변4

아무 sed나 사용하세요:

$ sed 's/;\([^;]*\);/-\1- Album:/' file
Thåström - Stjärna som är din - Album: Skebokvarnsv. 209

관련 정보