使用sed或awk用空格替换某些行中的换行符

时间:2017-12-10 14:13:38

标签: linux bash awk sed tr

我有一个带有一些事件的文本日志文件,我想修改它以提高可读性和打印格式。

我有:

$cat myfile 
foo bar foo bar

1.
1. foo bar
1:00

10.
3. foo bar
3:02

11.
4. foo
5:01

foobar foo

11.
foobar foo
3:48

2.
foobar foo
4:18

我想要的是:

$cat myfile
foo bar foo bar

1. 1. foo bar 1:00
10. 3. foo bar 3:02
11 4. foo 5:01

foobar foo

11. foobar foo 3:48
2. foobar foo 4:18

任何帮助表示赞赏!谢谢!

5 个答案:

答案 0 :(得分:3)

将记录设置为段落模式

awk -v RS=  '{$1=$1}1'

你会得到

foo bar foo bar
1. 1. foo bar 1:00
10. 3. foo bar 3:02
11. 4. foo 5:01
foobar foo
11. foobar foo 3:48
2. foobar foo 4:18

添加额外的空行,需要一些补充

awk -v RS=  '{$1=$1; t=!/[0-9]\./; 
              if(NR>1 && t) print ""; 
              print; 
              if(t) print ""}'

获取

foo bar foo bar

1. 1. foo bar 1:00
10. 3. foo bar 3:02
11. 4. foo 5:01

foobar foo

11. foobar foo 3:48
2. foobar foo 4:18

答案 1 :(得分:2)

请您试着跟随并告诉我这是否对您有帮助。

gulp.task('minify-img', function(){
    return imagemin(['./mobs/huge/*.png'], './mobs', {
        plugins: [
            imageminPngquant()
        ]
    }).then(function(){
        console.info("Images quant'd... is that a thing?!")
    });
});

输出如下。

awk '/^[0-9]+\./{ORS=" "} !NF{ORS="\n"};1; END{ORS="";print RS}'   Input_file

编辑: 此处还添加了一种非单一形式的解决方案,并附有说明。

foo bar foo bar

1. 1. foo bar 1:00
10. 3. foo bar 3:02
11. 4. foo 5:01
foobar foo

11. foobar foo 3:48
2. foobar foo 4:18

答案 2 :(得分:1)

Perl救援:

perl -l -000 -pe 's/^|$/\n/g if 2 != s/\n/ /g' -- file
  • -000启用"段落模式"它以空行分隔的块读取输入
  • -l从输入中删除输入分隔符并将其添加到输出
  • s/\n/ /g用空格替换所有换行符(在一个块中)并返回替换次数
  • s/^|$/\n/g在块的开头和结尾添加换行符

答案 3 :(得分:0)

你可以试试这个awk版本:

awk '/\.$/{printf "%s ", $0; next} {print} your-file

答案 4 :(得分:0)

您可以使用此sed

sed ':A;$bB;N;/\n$/!bA;:B;s/\n//g;s/\(^[^0-9]*$\)/\n&\n/;1,2s/^\n//' myfile

sed '
:A
$bB                     # jump to B if last line
N                       # add a new line in the pattern space
/\n$/!bA                # if this new line is empty, not return to A
:B
s/\n//g                 # remove all \n to get only one line
s/\(^[^0-9]*$\)/\n&\n/  # if the line not contain number add \n before and after
1,2s/^\n//              # remove the \n before the first line
' myfile