我想在Linux上删除多行文本

时间:2018-07-16 10:01:49

标签: linux perl awk sed

就是这样。
之前:

1
19:22
abcde

2
19:23

3
19:24
abbff

4
19:25
abbc

之后:

1
19:22
abcde

3
19:24
abbff

4
19:25
abbc

我想删除第2节中没有字母的部分。
我认为我应该使用perl或sed。但是我不知道该怎么办。 我尝试过这样。但这没用。

sed 's/[0-9]\n[0-9]\n%s\n//'

5 个答案:

答案 0 :(得分:4)

在Perl中足够简单。秘密在于通过将输入记录分隔符($/)设置为空字符串,将Perl置于“段落模式”。然后我们仅打印包含字母的记录。

#!/usr/bin/perl

use strict;
use warnings;

# Paragraph mode
local $/ = '';

# Read from STDIN a record (i.e. paragraph) at a time
while (<>) {
  # Only print records that include a letter
  print if /[a-z]/i;
}

这是作为Unix过滤器编写的,即它从STDIN读取并写入STDOUT。因此,如果它位于名为filter的文件中,则可以这样命名:

$ filter < your_input_file > your_output_file

或者,这是Perl中的简单命令行脚本({-00是将Perl置于段落模式的命令行选项):

$ perl -00 -ne'print if /[a-z]/' < your_input_file > your_output_file

答案 1 :(得分:3)

sed用于在单独的行上进行s / old / new /,仅此。对于其他任何事情,您都应该使用awk:

$ awk -v RS= -v ORS='\n\n' '/[[:alpha:]]/' file
1
19:22
abcde

3
19:24
abbff

4
19:25
abbc

上面就是这样:

  • RS=告诉awk输入记录用空白行分隔。
  • ORS='\n\n'告诉awk输出记录也必须用空行分隔。
  • /[[:alpha:]]/搜索并打印包含字母字符的记录。

答案 2 :(得分:0)

如果每个段落后面只有一个空白行,则可以使用长// @flow import React, { Component } from 'react'; import { View, Text } from 'react-native'; import { NavigationScreenProp } from 'react-navigation'; type Props = { navigate: NavigationScreenProp<{}> }; type State = {}; class Main extends Component<Props, State> { ... } oneliner(三种模式,因此实际上可能不是oneliner):

awk

想法是累积非空行,一旦找到字母字符就设置标志,并在空白输入行上,如果设置了该标志,则刷新整个累积的段落,将accume重置为空字符串,并将flag重置为零。

(请注意,如果输入的最后一行不一定为空,则可能需要添加一个$ echo '1 19:22 abcde 2 19:23 3 19:24 abbff 4 19:25 abbc ' | awk '/[^[:space:]]/ { accum = accum $0 "\n" } /^[[:space:]]*$/ { if(on) print accum $0; on = 0; accum = "" } /[[:alpha:]]/ { on = 1 }' 1 19:22 abcde 3 19:24 abbff 4 19:25 abbc 块,以检查当前是否有未刷新的段落并根据需要刷新它。)

答案 3 :(得分:0)

这可能对您有用(GNU sed):

sed ':a;$!{N;/^$/M!ba};/[[:alpha:]]/!d' file

收集由空行或文件结尾分隔的行,并删除不包含字母字符的最新集合。

这假定文件格式是固定的,如示例中所示。为了更准确地使用:

sed -r ':a;$!{N;/^$/M!ba};/^[1-9][0-9]*\n[0-9]{2}:[0-9]{2}\n[[:alpha:]]+\n?$/!d' file

答案 4 :(得分:0)

类似于Ed Morton的解决方案,但具有以下假设:

  • 文本块由2或3行组成。
  • 如果第三行,则包含任何字母的字符。

本质上,在这些条件下,我们只需要检查第三个字段即可:

awk 'BEGIN{RS=;ORS="\n\n";FS="\n"}(NF<3)' file

或没有BEGIN的类似内容:

awk -v RS= -v ORS='\n\n' -F '\n' '(NF<3)' file