How can I remove a line-feed/newline BEFORE a pattern using sed

前端 未结 5 1983
悲哀的现实
悲哀的现实 2021-01-02 17:34

The title already states it:

I want to use some linux one liner (e.g. sed)

to transform

Anytext
{

into

Anyt         


        
相关标签:
5条回答
  • 2021-01-02 18:18

    One way using sed:

    sed -ne '$! N; /^.*\n{/ { s/\n//; p; b }; $ { p; q }; P; D' infile
    

    A test. Assuming infile with content:

    one
    Anytext
    {
    two
    three
    {
    four
    five
    {
    

    Output will be:

    one
    Anytext{
    two
    three{
    four
    five{
    
    0 讨论(0)
  • 2021-01-02 18:22

    If the intention is to remove the newline from a \n{ sequence bbe seems to be the simplest tool to use:

    bbe -e 's/\n{/{/' infile
    
    0 讨论(0)
  • 2021-01-02 18:23

    Using awk

    cat file
    one
    Anytext
    {
    two
    three
    {
    four
    five
    {
    

    awk '{printf (!/^{/&&NR>1?RS:x)"%s",$0} END {print ""}' file
    one
    Anytext{
    two
    three{
    four
    five{
    
    0 讨论(0)
  • 2021-01-02 18:27

    Sure,

    sed 'N;s/\n{/{/'
    

    Or a more thorough version:

    sed ':r;$!{N;br};s/\n{/{/g'
    

    Here, :r sets a label that we can refer to in order to create a loop;

    $!{...} executes the given set of commands for every line except the last one;

    N;br are two commands the get executed in the loop: N appends a new line to the pattern space, and br branches back to the label r, completing the loop.

    Then you have all of your file in pattern space when you run the final command:

    s/\n{/{/g
    

    You can see the difference between the two approaches if you try it on something like

    Anytext
    {
    {
    {
    
    0 讨论(0)
  • 2021-01-02 18:32

    This might work for you (GNU sed):

    sed ':a;$!{N;/.*\n{/ba};s/\n{/{/g;P;D' file
    
    0 讨论(0)
提交回复
热议问题