![첫 번째 문자를 제외한 줄의 나머지 부분을 sed로 어떻게 바꿀 수 있습니까?](https://linux55.com/image/225941/%EC%B2%AB%20%EB%B2%88%EC%A7%B8%20%EB%AC%B8%EC%9E%90%EB%A5%BC%20%EC%A0%9C%EC%99%B8%ED%95%9C%20%EC%A4%84%EC%9D%98%20%EB%82%98%EB%A8%B8%EC%A7%80%20%EB%B6%80%EB%B6%84%EC%9D%84%20sed%EB%A1%9C%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EB%B0%94%EA%BF%80%20%EC%88%98%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
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
을 바꾸어 결과가 다음과 같도록 하고 싶습니다 . 단순화를 위해 답변과 질문이 모두 한 줄 길이라고 가정해 보겠습니다. 그 뒤에도 탭이 있습니다. 답변이나 질문 사이의 구분 기호는 공백입니다. 여기에는 표가 허용되지 않습니다.Q
A
NEXT
PREV
%%
%%
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
질문의 이전 버전과 같이 Q
s 및 A
s가 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.
%%
%%
위 댓글의 내 질문에 대한 답변에 따라 더 나은 해결책이 있을 수 있습니다.