Move a line before another in a multi-command sed file
Clash Royale CLAN TAG#URR8PPP
up vote
1
down vote
favorite
.
I have a text file similar to this:
A
B
C
D
E
F
G
and I need to:
- move line
E
before lineC
; - replace line
C
withX
(X
could be multiline); - replace line
G
withY
(Y
could be multiline); - remove lines
D
andF
.
This is the sed
file I have now:
/C/ c
X
/G/ c
Y
/D/ d
/F/ d
which does 2, 3, 4 but not 1. How can I fix the script to move E
before C
?
Note: I cannot rely on line numbers or contiguity of lines, which may vary; I can only rely on pattern matching.
sed
New contributor
Giovanni Lovato is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
add a comment |Â
up vote
1
down vote
favorite
.
I have a text file similar to this:
A
B
C
D
E
F
G
and I need to:
- move line
E
before lineC
; - replace line
C
withX
(X
could be multiline); - replace line
G
withY
(Y
could be multiline); - remove lines
D
andF
.
This is the sed
file I have now:
/C/ c
X
/G/ c
Y
/D/ d
/F/ d
which does 2, 3, 4 but not 1. How can I fix the script to move E
before C
?
Note: I cannot rely on line numbers or contiguity of lines, which may vary; I can only rely on pattern matching.
sed
New contributor
Giovanni Lovato is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
add a comment |Â
up vote
1
down vote
favorite
up vote
1
down vote
favorite
.
I have a text file similar to this:
A
B
C
D
E
F
G
and I need to:
- move line
E
before lineC
; - replace line
C
withX
(X
could be multiline); - replace line
G
withY
(Y
could be multiline); - remove lines
D
andF
.
This is the sed
file I have now:
/C/ c
X
/G/ c
Y
/D/ d
/F/ d
which does 2, 3, 4 but not 1. How can I fix the script to move E
before C
?
Note: I cannot rely on line numbers or contiguity of lines, which may vary; I can only rely on pattern matching.
sed
New contributor
Giovanni Lovato is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
.
I have a text file similar to this:
A
B
C
D
E
F
G
and I need to:
- move line
E
before lineC
; - replace line
C
withX
(X
could be multiline); - replace line
G
withY
(Y
could be multiline); - remove lines
D
andF
.
This is the sed
file I have now:
/C/ c
X
/G/ c
Y
/D/ d
/F/ d
which does 2, 3, 4 but not 1. How can I fix the script to move E
before C
?
Note: I cannot rely on line numbers or contiguity of lines, which may vary; I can only rely on pattern matching.
sed
sed
New contributor
Giovanni Lovato is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
New contributor
Giovanni Lovato is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
edited 5 hours ago
Rui F Ribeiro
37.2k1274118
37.2k1274118
New contributor
Giovanni Lovato is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
asked 5 hours ago


Giovanni Lovato
1063
1063
New contributor
Giovanni Lovato is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
New contributor
Giovanni Lovato is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
Giovanni Lovato is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
add a comment |Â
add a comment |Â
1 Answer
1
active
oldest
votes
up vote
2
down vote
For your particular case, this will do:
sed '
/C/,/E/
s/[CD]/&/
t s
s/E.*/&
X1
X2/
t e
H
:s
d
:e
p
x
D
/F/d
/G/c
Y1
Y2
' file
Someone smarter than me may be able to do it in a simpler way -- notice that this should handle the case where there are other lines than D
between C
and E
. This assumes however that the A
, B
, ... lines are sorted, ie no G
between C
and D
.
Generally, cases like this are done much more obviously with ed
or ex
:
$ echo '/E/m/C/-1
/C/c
X1
X2
.
/G/c
Y1
Y2
.
g/[DF]/d
w
' | ed -s file
$ cat file
A
B
E
X1
X2
Y1
Y2
The /PAT1/m/PAT2/-1
command will move the line matching PAT1
before the line matching PAT2
.
The /PAT/c
command will change the line matching PAT
to the following lines terminated by .
.
The g/PAT/d
command will go to all lines matching PAT
and delete them.
... couple of things here: I recommend using a heredoc withed
instead ofecho
-ing a multiline string and I recommend changing the order of operations withed/ex
to 1-move, 2-delete, 3-change lines just in case the text to be deleted matches anything that is to be inserted; also, I'd use a regex to match eitherD
orF
(or separate regexes) instead of a bracket expression: OP's input sample is really unfortunate to say the least, most likely the actual data doesn't consist of single-letter lines; anyway this kind of question can only get punctual answers, there's no generic solution.
– don_crissti
2 mins ago
add a comment |Â
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
2
down vote
For your particular case, this will do:
sed '
/C/,/E/
s/[CD]/&/
t s
s/E.*/&
X1
X2/
t e
H
:s
d
:e
p
x
D
/F/d
/G/c
Y1
Y2
' file
Someone smarter than me may be able to do it in a simpler way -- notice that this should handle the case where there are other lines than D
between C
and E
. This assumes however that the A
, B
, ... lines are sorted, ie no G
between C
and D
.
Generally, cases like this are done much more obviously with ed
or ex
:
$ echo '/E/m/C/-1
/C/c
X1
X2
.
/G/c
Y1
Y2
.
g/[DF]/d
w
' | ed -s file
$ cat file
A
B
E
X1
X2
Y1
Y2
The /PAT1/m/PAT2/-1
command will move the line matching PAT1
before the line matching PAT2
.
The /PAT/c
command will change the line matching PAT
to the following lines terminated by .
.
The g/PAT/d
command will go to all lines matching PAT
and delete them.
... couple of things here: I recommend using a heredoc withed
instead ofecho
-ing a multiline string and I recommend changing the order of operations withed/ex
to 1-move, 2-delete, 3-change lines just in case the text to be deleted matches anything that is to be inserted; also, I'd use a regex to match eitherD
orF
(or separate regexes) instead of a bracket expression: OP's input sample is really unfortunate to say the least, most likely the actual data doesn't consist of single-letter lines; anyway this kind of question can only get punctual answers, there's no generic solution.
– don_crissti
2 mins ago
add a comment |Â
up vote
2
down vote
For your particular case, this will do:
sed '
/C/,/E/
s/[CD]/&/
t s
s/E.*/&
X1
X2/
t e
H
:s
d
:e
p
x
D
/F/d
/G/c
Y1
Y2
' file
Someone smarter than me may be able to do it in a simpler way -- notice that this should handle the case where there are other lines than D
between C
and E
. This assumes however that the A
, B
, ... lines are sorted, ie no G
between C
and D
.
Generally, cases like this are done much more obviously with ed
or ex
:
$ echo '/E/m/C/-1
/C/c
X1
X2
.
/G/c
Y1
Y2
.
g/[DF]/d
w
' | ed -s file
$ cat file
A
B
E
X1
X2
Y1
Y2
The /PAT1/m/PAT2/-1
command will move the line matching PAT1
before the line matching PAT2
.
The /PAT/c
command will change the line matching PAT
to the following lines terminated by .
.
The g/PAT/d
command will go to all lines matching PAT
and delete them.
... couple of things here: I recommend using a heredoc withed
instead ofecho
-ing a multiline string and I recommend changing the order of operations withed/ex
to 1-move, 2-delete, 3-change lines just in case the text to be deleted matches anything that is to be inserted; also, I'd use a regex to match eitherD
orF
(or separate regexes) instead of a bracket expression: OP's input sample is really unfortunate to say the least, most likely the actual data doesn't consist of single-letter lines; anyway this kind of question can only get punctual answers, there's no generic solution.
– don_crissti
2 mins ago
add a comment |Â
up vote
2
down vote
up vote
2
down vote
For your particular case, this will do:
sed '
/C/,/E/
s/[CD]/&/
t s
s/E.*/&
X1
X2/
t e
H
:s
d
:e
p
x
D
/F/d
/G/c
Y1
Y2
' file
Someone smarter than me may be able to do it in a simpler way -- notice that this should handle the case where there are other lines than D
between C
and E
. This assumes however that the A
, B
, ... lines are sorted, ie no G
between C
and D
.
Generally, cases like this are done much more obviously with ed
or ex
:
$ echo '/E/m/C/-1
/C/c
X1
X2
.
/G/c
Y1
Y2
.
g/[DF]/d
w
' | ed -s file
$ cat file
A
B
E
X1
X2
Y1
Y2
The /PAT1/m/PAT2/-1
command will move the line matching PAT1
before the line matching PAT2
.
The /PAT/c
command will change the line matching PAT
to the following lines terminated by .
.
The g/PAT/d
command will go to all lines matching PAT
and delete them.
For your particular case, this will do:
sed '
/C/,/E/
s/[CD]/&/
t s
s/E.*/&
X1
X2/
t e
H
:s
d
:e
p
x
D
/F/d
/G/c
Y1
Y2
' file
Someone smarter than me may be able to do it in a simpler way -- notice that this should handle the case where there are other lines than D
between C
and E
. This assumes however that the A
, B
, ... lines are sorted, ie no G
between C
and D
.
Generally, cases like this are done much more obviously with ed
or ex
:
$ echo '/E/m/C/-1
/C/c
X1
X2
.
/G/c
Y1
Y2
.
g/[DF]/d
w
' | ed -s file
$ cat file
A
B
E
X1
X2
Y1
Y2
The /PAT1/m/PAT2/-1
command will move the line matching PAT1
before the line matching PAT2
.
The /PAT/c
command will change the line matching PAT
to the following lines terminated by .
.
The g/PAT/d
command will go to all lines matching PAT
and delete them.
edited 34 mins ago
answered 3 hours ago
mosvy
2,755115
2,755115
... couple of things here: I recommend using a heredoc withed
instead ofecho
-ing a multiline string and I recommend changing the order of operations withed/ex
to 1-move, 2-delete, 3-change lines just in case the text to be deleted matches anything that is to be inserted; also, I'd use a regex to match eitherD
orF
(or separate regexes) instead of a bracket expression: OP's input sample is really unfortunate to say the least, most likely the actual data doesn't consist of single-letter lines; anyway this kind of question can only get punctual answers, there's no generic solution.
– don_crissti
2 mins ago
add a comment |Â
... couple of things here: I recommend using a heredoc withed
instead ofecho
-ing a multiline string and I recommend changing the order of operations withed/ex
to 1-move, 2-delete, 3-change lines just in case the text to be deleted matches anything that is to be inserted; also, I'd use a regex to match eitherD
orF
(or separate regexes) instead of a bracket expression: OP's input sample is really unfortunate to say the least, most likely the actual data doesn't consist of single-letter lines; anyway this kind of question can only get punctual answers, there's no generic solution.
– don_crissti
2 mins ago
... couple of things here: I recommend using a heredoc with
ed
instead of echo
-ing a multiline string and I recommend changing the order of operations with ed/ex
to 1-move, 2-delete, 3-change lines just in case the text to be deleted matches anything that is to be inserted; also, I'd use a regex to match either D
or F
(or separate regexes) instead of a bracket expression: OP's input sample is really unfortunate to say the least, most likely the actual data doesn't consist of single-letter lines; anyway this kind of question can only get punctual answers, there's no generic solution.– don_crissti
2 mins ago
... couple of things here: I recommend using a heredoc with
ed
instead of echo
-ing a multiline string and I recommend changing the order of operations with ed/ex
to 1-move, 2-delete, 3-change lines just in case the text to be deleted matches anything that is to be inserted; also, I'd use a regex to match either D
or F
(or separate regexes) instead of a bracket expression: OP's input sample is really unfortunate to say the least, most likely the actual data doesn't consist of single-letter lines; anyway this kind of question can only get punctual answers, there's no generic solution.– don_crissti
2 mins ago
add a comment |Â
Giovanni Lovato is a new contributor. Be nice, and check out our Code of Conduct.
Giovanni Lovato is a new contributor. Be nice, and check out our Code of Conduct.
Giovanni Lovato is a new contributor. Be nice, and check out our Code of Conduct.
Giovanni Lovato is a new contributor. Be nice, and check out our Code of Conduct.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f476811%2fmove-a-line-before-another-in-a-multi-command-sed-file%23new-answer', 'question_page');
);
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password