How to join a line with a pattern with the next line with sed?
I can't find this case in the board, so I'm asking the question.
This is input file:
module
x(a,b,c)
module
y(d,e,f,
g,h,i)
module
z(j,k,l)
And output file should be:
module x(a,b,c)
module y(d,e,f,
g,h,i)
module z(j,k,l)
text-processing sed join
add a comment |
I can't find this case in the board, so I'm asking the question.
This is input file:
module
x(a,b,c)
module
y(d,e,f,
g,h,i)
module
z(j,k,l)
And output file should be:
module x(a,b,c)
module y(d,e,f,
g,h,i)
module z(j,k,l)
text-processing sed join
If any of the answers solved your problem, please accept it by clicking the checkmark next to it. Thank you!
– Jeff Schaller
Jan 20 at 13:01
add a comment |
I can't find this case in the board, so I'm asking the question.
This is input file:
module
x(a,b,c)
module
y(d,e,f,
g,h,i)
module
z(j,k,l)
And output file should be:
module x(a,b,c)
module y(d,e,f,
g,h,i)
module z(j,k,l)
text-processing sed join
I can't find this case in the board, so I'm asking the question.
This is input file:
module
x(a,b,c)
module
y(d,e,f,
g,h,i)
module
z(j,k,l)
And output file should be:
module x(a,b,c)
module y(d,e,f,
g,h,i)
module z(j,k,l)
text-processing sed join
text-processing sed join
edited Dec 17 '18 at 6:34
αғsнιη
16.7k102865
16.7k102865
asked Dec 17 '18 at 6:24
funfunfunfun
112
112
If any of the answers solved your problem, please accept it by clicking the checkmark next to it. Thank you!
– Jeff Schaller
Jan 20 at 13:01
add a comment |
If any of the answers solved your problem, please accept it by clicking the checkmark next to it. Thank you!
– Jeff Schaller
Jan 20 at 13:01
If any of the answers solved your problem, please accept it by clicking the checkmark next to it. Thank you!
– Jeff Schaller
Jan 20 at 13:01
If any of the answers solved your problem, please accept it by clicking the checkmark next to it. Thank you!
– Jeff Schaller
Jan 20 at 13:01
add a comment |
3 Answers
3
active
oldest
votes
What you want to do is to join the module
lines with the next line.
Using sed
:
$ sed '/^module/N;s/n//' file
module x(a,b,c)
module y(d,e,f,
g,h,i)
module z(j,k,l)
This is with your data copied and pasted as is, with spaces at the end of each line.
The sed
command will print each line as it is read, but when it encounters a line that starts with the string module
, it appends the next line with an embedded newline character in-between (this is what N
does). We remove that newline character with a substitution before the result is printed.
If your data has no spaces at the end of the lines, use
$ sed '/^module/N;s/n/ /' file
module x(a,b,c)
module y(d,e,f,
g,h,i)
module z(j,k,l)
Just in case you'd want this (assuming no spaces at end of input lines):
$ sed -e '/^module/bpp' -e 'H;$bpp' -e 'd'
-e ':pp' -e 'x;/^$/d;s/n/ /g' file
module x(a,b,c)
module y(d,e,f, g,h,i)
module z(j,k,l)
Annotated sed
script:
/^module/ b print_previous; # print previous record
H; # append this line to hold space
$ b print_previous; # print previous (last) record
d; # end processing this line
:print_previous; # prints a record accumulated in the hold space
x; # swap in the hold space
/^$/ d; # if line is empty, delete it
s/n/ /g; # replace embedded newlines by spaces
# (implicit print)
add a comment |
Using awk:
~ awk '/^module/ {l = $0; getline; printf "%s", l} 1' input-file
module x(a,b,c)
module y(d,e,f,
g,h,i)
module z(j,k,l)
For each line that starts with module
, save the line in l
, move to the next line (getline
), and print the saved line without a newline. Then print every line.
add a comment |
Another option: create an ed
script!
This starts by pre-counting the number of joins that are required; it then generates that number of ed
search & join commands and pipes them, along with a save & quit at the end, into ed
:
#!/bin/bash
n=$(grep -c '^module *$' input)
{
for((i=1; i <= n; i++))
do
printf '/^module *$/n.,+1jn'
done
echo w
echo q
} | ed -s input >/dev/null
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "106"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
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
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f489410%2fhow-to-join-a-line-with-a-pattern-with-the-next-line-with-sed%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
What you want to do is to join the module
lines with the next line.
Using sed
:
$ sed '/^module/N;s/n//' file
module x(a,b,c)
module y(d,e,f,
g,h,i)
module z(j,k,l)
This is with your data copied and pasted as is, with spaces at the end of each line.
The sed
command will print each line as it is read, but when it encounters a line that starts with the string module
, it appends the next line with an embedded newline character in-between (this is what N
does). We remove that newline character with a substitution before the result is printed.
If your data has no spaces at the end of the lines, use
$ sed '/^module/N;s/n/ /' file
module x(a,b,c)
module y(d,e,f,
g,h,i)
module z(j,k,l)
Just in case you'd want this (assuming no spaces at end of input lines):
$ sed -e '/^module/bpp' -e 'H;$bpp' -e 'd'
-e ':pp' -e 'x;/^$/d;s/n/ /g' file
module x(a,b,c)
module y(d,e,f, g,h,i)
module z(j,k,l)
Annotated sed
script:
/^module/ b print_previous; # print previous record
H; # append this line to hold space
$ b print_previous; # print previous (last) record
d; # end processing this line
:print_previous; # prints a record accumulated in the hold space
x; # swap in the hold space
/^$/ d; # if line is empty, delete it
s/n/ /g; # replace embedded newlines by spaces
# (implicit print)
add a comment |
What you want to do is to join the module
lines with the next line.
Using sed
:
$ sed '/^module/N;s/n//' file
module x(a,b,c)
module y(d,e,f,
g,h,i)
module z(j,k,l)
This is with your data copied and pasted as is, with spaces at the end of each line.
The sed
command will print each line as it is read, but when it encounters a line that starts with the string module
, it appends the next line with an embedded newline character in-between (this is what N
does). We remove that newline character with a substitution before the result is printed.
If your data has no spaces at the end of the lines, use
$ sed '/^module/N;s/n/ /' file
module x(a,b,c)
module y(d,e,f,
g,h,i)
module z(j,k,l)
Just in case you'd want this (assuming no spaces at end of input lines):
$ sed -e '/^module/bpp' -e 'H;$bpp' -e 'd'
-e ':pp' -e 'x;/^$/d;s/n/ /g' file
module x(a,b,c)
module y(d,e,f, g,h,i)
module z(j,k,l)
Annotated sed
script:
/^module/ b print_previous; # print previous record
H; # append this line to hold space
$ b print_previous; # print previous (last) record
d; # end processing this line
:print_previous; # prints a record accumulated in the hold space
x; # swap in the hold space
/^$/ d; # if line is empty, delete it
s/n/ /g; # replace embedded newlines by spaces
# (implicit print)
add a comment |
What you want to do is to join the module
lines with the next line.
Using sed
:
$ sed '/^module/N;s/n//' file
module x(a,b,c)
module y(d,e,f,
g,h,i)
module z(j,k,l)
This is with your data copied and pasted as is, with spaces at the end of each line.
The sed
command will print each line as it is read, but when it encounters a line that starts with the string module
, it appends the next line with an embedded newline character in-between (this is what N
does). We remove that newline character with a substitution before the result is printed.
If your data has no spaces at the end of the lines, use
$ sed '/^module/N;s/n/ /' file
module x(a,b,c)
module y(d,e,f,
g,h,i)
module z(j,k,l)
Just in case you'd want this (assuming no spaces at end of input lines):
$ sed -e '/^module/bpp' -e 'H;$bpp' -e 'd'
-e ':pp' -e 'x;/^$/d;s/n/ /g' file
module x(a,b,c)
module y(d,e,f, g,h,i)
module z(j,k,l)
Annotated sed
script:
/^module/ b print_previous; # print previous record
H; # append this line to hold space
$ b print_previous; # print previous (last) record
d; # end processing this line
:print_previous; # prints a record accumulated in the hold space
x; # swap in the hold space
/^$/ d; # if line is empty, delete it
s/n/ /g; # replace embedded newlines by spaces
# (implicit print)
What you want to do is to join the module
lines with the next line.
Using sed
:
$ sed '/^module/N;s/n//' file
module x(a,b,c)
module y(d,e,f,
g,h,i)
module z(j,k,l)
This is with your data copied and pasted as is, with spaces at the end of each line.
The sed
command will print each line as it is read, but when it encounters a line that starts with the string module
, it appends the next line with an embedded newline character in-between (this is what N
does). We remove that newline character with a substitution before the result is printed.
If your data has no spaces at the end of the lines, use
$ sed '/^module/N;s/n/ /' file
module x(a,b,c)
module y(d,e,f,
g,h,i)
module z(j,k,l)
Just in case you'd want this (assuming no spaces at end of input lines):
$ sed -e '/^module/bpp' -e 'H;$bpp' -e 'd'
-e ':pp' -e 'x;/^$/d;s/n/ /g' file
module x(a,b,c)
module y(d,e,f, g,h,i)
module z(j,k,l)
Annotated sed
script:
/^module/ b print_previous; # print previous record
H; # append this line to hold space
$ b print_previous; # print previous (last) record
d; # end processing this line
:print_previous; # prints a record accumulated in the hold space
x; # swap in the hold space
/^$/ d; # if line is empty, delete it
s/n/ /g; # replace embedded newlines by spaces
# (implicit print)
edited Dec 17 '18 at 10:46
answered Dec 17 '18 at 6:52
KusalanandaKusalananda
126k16239393
126k16239393
add a comment |
add a comment |
Using awk:
~ awk '/^module/ {l = $0; getline; printf "%s", l} 1' input-file
module x(a,b,c)
module y(d,e,f,
g,h,i)
module z(j,k,l)
For each line that starts with module
, save the line in l
, move to the next line (getline
), and print the saved line without a newline. Then print every line.
add a comment |
Using awk:
~ awk '/^module/ {l = $0; getline; printf "%s", l} 1' input-file
module x(a,b,c)
module y(d,e,f,
g,h,i)
module z(j,k,l)
For each line that starts with module
, save the line in l
, move to the next line (getline
), and print the saved line without a newline. Then print every line.
add a comment |
Using awk:
~ awk '/^module/ {l = $0; getline; printf "%s", l} 1' input-file
module x(a,b,c)
module y(d,e,f,
g,h,i)
module z(j,k,l)
For each line that starts with module
, save the line in l
, move to the next line (getline
), and print the saved line without a newline. Then print every line.
Using awk:
~ awk '/^module/ {l = $0; getline; printf "%s", l} 1' input-file
module x(a,b,c)
module y(d,e,f,
g,h,i)
module z(j,k,l)
For each line that starts with module
, save the line in l
, move to the next line (getline
), and print the saved line without a newline. Then print every line.
answered Dec 17 '18 at 6:52
murumuru
1
1
add a comment |
add a comment |
Another option: create an ed
script!
This starts by pre-counting the number of joins that are required; it then generates that number of ed
search & join commands and pipes them, along with a save & quit at the end, into ed
:
#!/bin/bash
n=$(grep -c '^module *$' input)
{
for((i=1; i <= n; i++))
do
printf '/^module *$/n.,+1jn'
done
echo w
echo q
} | ed -s input >/dev/null
add a comment |
Another option: create an ed
script!
This starts by pre-counting the number of joins that are required; it then generates that number of ed
search & join commands and pipes them, along with a save & quit at the end, into ed
:
#!/bin/bash
n=$(grep -c '^module *$' input)
{
for((i=1; i <= n; i++))
do
printf '/^module *$/n.,+1jn'
done
echo w
echo q
} | ed -s input >/dev/null
add a comment |
Another option: create an ed
script!
This starts by pre-counting the number of joins that are required; it then generates that number of ed
search & join commands and pipes them, along with a save & quit at the end, into ed
:
#!/bin/bash
n=$(grep -c '^module *$' input)
{
for((i=1; i <= n; i++))
do
printf '/^module *$/n.,+1jn'
done
echo w
echo q
} | ed -s input >/dev/null
Another option: create an ed
script!
This starts by pre-counting the number of joins that are required; it then generates that number of ed
search & join commands and pipes them, along with a save & quit at the end, into ed
:
#!/bin/bash
n=$(grep -c '^module *$' input)
{
for((i=1; i <= n; i++))
do
printf '/^module *$/n.,+1jn'
done
echo w
echo q
} | ed -s input >/dev/null
answered Jan 19 at 2:37
Jeff SchallerJeff Schaller
40.1k1054126
40.1k1054126
add a comment |
add a comment |
Thanks for contributing an answer to Unix & Linux Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
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
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f489410%2fhow-to-join-a-line-with-a-pattern-with-the-next-line-with-sed%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
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
Required, but never shown
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
Required, but never shown
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
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
If any of the answers solved your problem, please accept it by clicking the checkmark next to it. Thank you!
– Jeff Schaller
Jan 20 at 13:01