LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Linux - Newbie (https://www.linuxquestions.org/questions/linux-newbie-8/)
-   -   print only changed line with sed after double substition (https://www.linuxquestions.org/questions/linux-newbie-8/print-only-changed-line-with-sed-after-double-substition-4175601021/)

astrogeek 03-04-2017 02:23 PM

Here is my complete solution, just for... completeness...

Code:

$ sed -rn '/up.*down/s/up|down/\U&/gp' ud.txt
They were neither UP nor DOWN

This is GNU of course, on Slackware, mileage may vary on the mac.

vincix 03-04-2017 02:28 PM

That's good to know, but that's not exactly what I wanted to it to display. I wanted it to display ALL altered lines only ONCE. The problem is that with my initial solution, even though it displays lines that contain either 'up' or 'down', lines that contain both 'up' and 'down' are displayed twice (which is quite an obvious behaviour - first it changes up to UP, the it displays the line as it is, and then that line is in turn altered, by changing down to DOWN, so that's the second time). So your solution only solves this part of the problem, but not the whole problem through one command.

astrogeek 03-04-2017 02:36 PM

Quote:

Originally Posted by vincix (Post 5679141)
I wanted it to display ALL altered lines only ONCE.

Then the rules seem tohave been changed...

Quote:

Originally Posted by vincix (Post 5678742)
in this case I'm trying to print only the lines that were altered by both substitions. The two substitions are 's/down/DOWN/' and 's/up/UP/'.

...which will be only the one line.

If you wnat to also show lines which only include one of the words, simply remove the address...

Code:

$ sed -rn 's/up|down/\U&/gp' ud.txt
He marched them UP to the top of the hill
And he marched them DOWN again
And when they were UP they were UP
And when they were DOWN they were DOWN
And when they were only half-way UP
They were neither UP nor DOWN


vincix 03-04-2017 02:45 PM

I don't see any difference in meaning between the two quotes, but ok. Come to think about it, though, I understand now why the initial post might have been ambiguous - because you're thinking that I'm talking about both substitutions on the same line, but I was referring on the file as a whole. Anyway, now we're talking about the same thing. It's much easier than I initially thought.

What is the role of & after U?

astrogeek 03-04-2017 02:49 PM

Perhaps there is a language barrier, but those sentences are quite different to my understanding.

Quote:

Originally Posted by vincix (Post 5679155)
What is the role of & after U?

Did you not read post #5?

vincix 03-04-2017 02:57 PM

Oh, yes, I know about &. I guess I thought differently about it in this context because of the \U. So \U alters the matched pattern.

Yeah, I guess you're right about the sentence, I realised now after rereading it.

astrogeek 03-04-2017 03:13 PM

I have to admit that even though I use sed daily, I did not see this case until reading syg00's hint. I think that was the pleasant surprise they mentioned.

Using sed is a lot like learning to ride a bicycle, skill improves only with number of attempts!

If your question is sufficiently answered then please mark the thread as solved.

Good luck!

MadeInGermany 03-06-2017 04:28 AM

With the OR condition it is nearly impossible with a non-GNU sed.
With awk
Code:

awk '{ p1=sub(/up/,"UP"); p2=sub(/down/,"DOWN") } (p1 || p2)' file.txt

vincix 03-06-2017 05:54 AM

@MadeInGermany I did see your previous solution - you understood it the same way astrogeek did (which was linguistically correct, even if it wasn't my intention exactly)-, but I wanted to go through each step by myself as much as possible, that's why I tried not to take it into consideration until I reached a later stage.

After I finish (as it were) with sed, I'll go on to learn some awk, too. I had already started it, but I combined it with some bash and so on, and so forth.


All times are GMT -5. The time now is 05:38 AM.