从文本文件中的行范围中删除\ n字符

时间:2014-09-20 09:37:09

标签: perl awk sed

我们假设我们有一个1000行的文本文件。

我们如何删除第20行到第500行的新行字符(例如用空格替换)?

我的尝试:

sed '20,500p; N; s/\n/ /;' #better not to say anything

所有其他行(1-19&& 501-1000)应保持原样。

由于我熟悉sed,awk或perl解决方案受到欢迎,但请与他们一起解释,因为我是一名perl和awk新手。

4 个答案:

答案 0 :(得分:3)

你可以使用这样的东西(我的例子是稍微小一点: - )

$ cat file
1
2
3
4
5
6
7
8
9
10
$ awk '{printf "%s%s", $0, (2<=NR&&NR<=5?FS:RS)}' file
1
2 3 4 5 6
7
8
9
10

%s格式说明符中的第二个printf被字段分隔符(默认为空格)或记录分隔符(换行符)替换,具体取决于记录号是否在范围内

可替换地:

$ awk '{ORS=(2<=NR&&NR<=5?FS:RS)}1' file
1
2 3 4 5 6
7
8
9
10

根据行号更改输出记录分隔符并打印每一行。

如果需要,您可以使用awk -v start=2 -v end=5 '...'

传递开始和结束的变量

答案 1 :(得分:2)

这可能适合你(GNU sed):

sed -r '20,500{N;s/^(.*)(\n)/\2\1 /;D}' file

或者更可读:

sed ':a;20,500{N;s/\n/ /;ta}' file

答案 2 :(得分:1)

这是一个perl版本:

my $min = 5; my $max = 10;
while (<DATA>) {
    if ($. > $min && $. < $max) {
        chomp;
        $_ .= " ";
    }
    print;
}

__DATA__
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

输出:

1
2
3
4
5
6 7 8 9 10
11
12
13
14
15

它读入DATA(您可以将其设置为文件句柄或应用程序所需的任何内容),并检查行号$.。虽然行号介于$min$max之间,但行结尾为chomp,并且该行的末尾添加了一个空格;否则,该行按原样打印。

答案 3 :(得分:1)

使用perl one-liner去除换行符:

perl -i -pe 'chomp if 20..500' file

或者用空格替换它:

perl -i -pe 's/\R/ / if 20..500' file

说明:

切换

  • -i:编辑<>个文件(如果提供了扩展程序,则进行备份)
  • -p:为输入文件中的每个“行”创建一个while(<>){...; print}循环。
  • -e:告诉perl在命令行上执行代码。

<强>代码