我们假设我们有一个1000行的文本文件。
我们如何删除第20行到第500行的新行字符(例如用空格替换)?
我的尝试:
sed '20,500p; N; s/\n/ /;' #better not to say anything
所有其他行(1-19&& 501-1000)应保持原样。
由于我熟悉sed,awk或perl解决方案受到欢迎,但请与他们一起解释,因为我是一名perl和awk新手。
答案 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
在命令行上执行代码。 <强>代码强>:
chomp
:删除新行20 .. 500
:如果Range operator ..
位于第20至500行