첫 번째 문자를 제외한 줄의 나머지 부분을 sed로 어떻게 바꿀 수 있습니까?

첫 번째 문자를 제외한 줄의 나머지 부분을 sed로 어떻게 바꿀 수 있습니까?

fr.fc사용된 플래시카드를 나타내는 파일이 있습니다.하드 디스크sed나는 그것을 사용하여 다음과 같은 파일을 생성하고 싶습니다 .fr-swapped.fc

%% This is a card set for hardv(1)
%% Created at Feb 1, 1997
NEXT    2023-09-10 09:18:28 +0200
PREV    2023-09-08 09:18:28 +0200
Q   We should save money.
A   Nous devons économiser de l'argent.
%%
NEXT    2023-09-09 10:51:14 +0200
PREV    2023-09-05 10:51:14 +0200
Q   I should save money.
A   Je dois économiser de l'argent.
%%
%%
NEXT    2023-09-08 20:50:03 +0200
PREV    2023-09-08 20:50:03 +0200
Q   Demander son chemin in four ways de quatre manières.
A   Pardon, pouvez-vous m'aider ...
%%
%%
NEXT    2023-09-08 20:50:03 +0200
PREV    2023-09-08 20:50:03 +0200
Q   I need your help.
A   Je besoin de votre aide.
%%
%%

^Q\t질문( 으로 시작 )을 답변( 로 시작)과 바꾸지 않고 답변( 으로 시작 ) ^A\t을 바꾸어 결과가 다음과 같도록 하고 싶습니다 . 단순화를 위해 답변과 질문이 모두 한 줄 길이라고 가정해 보겠습니다. 그 뒤에도 탭이 있습니다. 답변이나 질문 사이의 구분 기호는 공백입니다. 여기에는 표가 허용되지 않습니다.QANEXTPREV

%%
%%
NEXT    2023-09-08 20:50:03 +0200
PREV    2023-09-08 20:50:03 +0200
Q   Je besoin de votre aide.
A   I need your help.
%%
%%

나는 시도했지만 sed -n -E '/^Q\t/p; /^A\t/p' fr.fc | sed -E 'N; s/^([QA]{1,1})(.*)\n(.*)/\3\n\2/' >fr-swapped.fc성공하지 못했습니다.

답변1

perl게으른 메소드 는 전체 입력이 로드 $_되고 이를 대체할 수 있는 slurp 모드에서 사용됩니다 .

perl -0777 -pe 's/^Q(\t.*\n)A(\t.*\n)/Q$2A$1/mg' your-file

질문의 이전 버전과 같이 Qs 및 As가 TAB 들여쓰기를 사용하여 계속되는 여러 줄로 구성될 수 있다면 쉽게 적응할 수 있습니다.

perl -0777 -pe 's/^Q(\t.*\n(?:\t.*\n)*)A(\t.*\n(?:\t.*\n)*)/Q$2A$1/mg' your-file

그런데 We should-> Nous devrions, I should-> Je devrais, I need-> 이어야 합니다 J'ai besoin de.

답변2

왜 그렇게 복잡합니까? 다음과 같이 N;P;D패턴을 any와 함께 사용 sed하면 항상 두 행을 동시에 처리할 수 있습니다 .

sed -E 'N;s/^Q(.*)(\nA)(.*)/Q\3\2A\1/;P;D'

그것은 당신이 설명하는 것과 정확히 일치합니다. 이중선을 Q 뒤의 모든 것과 A 뒤의 모든 것으로 분할한 다음 해당 부분을 교체합니다.

답변3

GNU 사용sed

$ sed -Ez 's/(Q[ \t]+)([^\n]*\n?)(A[ \t]+)([^\n]*\n?)/\1\4\3\2/gwfr-swapped.fc' fr.fc
$ cat fr-swapped.fc
%% This is a card set for hardv(1)
%% Created at Feb 1, 1997
NEXT    2023-09-10 09:18:28 +0200
PREV    2023-09-08 09:18:28 +0200
Q   Nous devons économiser de l'argent.
A   We should save money.
%%
NEXT    2023-09-09 10:51:14 +0200
PREV    2023-09-05 10:51:14 +0200
Q   Je dois économiser de l'argent.
A   I should save money.
%%
%%
NEXT    2023-09-08 20:50:03 +0200
PREV    2023-09-08 20:50:03 +0200
Q   Pardon, pouvez-vous m'aider ...
A   Demander son chemin in four ways de quatre manières.
%%
%%
NEXT    2023-09-08 20:50:03 +0200
PREV    2023-09-08 20:50:03 +0200
Q   Je besoin de votre aide.
A   I need your help.
%%
%%

답변4

이것은 아마도 awk로 하고 싶은 일일 것입니다:

$ cat tst.sh
#!/usr/bin/env bash

awk '
    sub(/^Q\t/,"A\t") {
        question = $0
        next
    }
    sub(/^A\t/,"Q\t") {
        $0 = $0 ORS question
    }
    { print }
' fr.fc

$ ./tst.sh
%%      This is a card set for hardv(1)
%%      Created at Feb 1, 1997
NEXT    2023-09-10 09:18:28 +0200
PREV    2023-09-08 09:18:28 +0200
Q       Nous devons économiser de l'argent.
A       We should save money.
%%
NEXT    2023-09-09 10:51:14 +0200
PREV    2023-09-05 10:51:14 +0200
Q       Je dois économiser de l'argent.
A       I should save money.
%%
%%
NEXT    2023-09-08 20:50:03 +0200
PREV    2023-09-08 20:50:03 +0200
Q       Pardon, pouvez-vous m'aider ...
A       Demander son chemin in four ways de quatre manières.
%%
%%
NEXT    2023-09-08 20:50:03 +0200
PREV    2023-09-08 20:50:03 +0200
Q       Je besoin de votre aide.
A       I need your help.
%%
%%

명확성이 더 중요하다면 위의 내용은 sed만큼 간결합니다.

$ awk 'sub(/^Q\t/,"A\t"){q=$0;next}sub(/^A\t/,"Q\t"){$0=$0ORS q}1' fr.fc
%%      This is a card set for hardv(1)
%%      Created at Feb 1, 1997
NEXT    2023-09-10 09:18:28 +0200
PREV    2023-09-08 09:18:28 +0200
Q       Nous devons économiser de l'argent.
A       We should save money.
%%
NEXT    2023-09-09 10:51:14 +0200
PREV    2023-09-05 10:51:14 +0200
Q       Je dois économiser de l'argent.
A       I should save money.
%%
%%
NEXT    2023-09-08 20:50:03 +0200
PREV    2023-09-08 20:50:03 +0200
Q       Pardon, pouvez-vous m'aider ...
A       Demander son chemin in four ways de quatre manières.
%%
%%
NEXT    2023-09-08 20:50:03 +0200
PREV    2023-09-08 20:50:03 +0200
Q       Je besoin de votre aide.
A       I need your help.
%%
%%

위 댓글의 내 질문에 대한 답변에 따라 더 나은 해결책이 있을 수 있습니다.

관련 정보