【发布时间】:2014-08-21 11:13:17
【问题描述】:
祝大家今天好,
我想知道如何在特定行号处替换换行符。
到目前为止我已经完成了:[Linenumber=11]
sed ':a;N;$!ba;11s/\n//g'
提前感谢任何线索
【问题讨论】:
祝大家今天好,
我想知道如何在特定行号处替换换行符。
到目前为止我已经完成了:[Linenumber=11]
sed ':a;N;$!ba;11s/\n//g'
提前感谢任何线索
【问题讨论】:
好吧,如果您知道行号,那么在任何语言中都非常简单:
$ cat file
1
2
3
4
5
使用sed:
$ sed '3{N;s/\n//;}' file
1
2
34
5
在sed 中,您可以使用数字作为表示行号的模式。我们可以将动作括在大括号内,这样它只在模式为真时发生。这里3 代表第3 行。大括号内是我们的操作,它声明N 将下一行附加到由新行分隔的模式空间。此时我们的模式空间中有line 3\nline4。我们接着进行一个简单的替换,将换行符替换为空。
使用awk:
$ awk 'NR==3{printf "%s", $0; next}1' file
1
2
34
5
awk 还包含模式操作语句。这里我们使用NR==3 作为我们的模式。 NR 是 awk 内置变量,保存当前行号。当行号为 3 时,我们要求 awk 执行特定操作。我们的动作在大括号内。我们使用printf,它明确需要换行符。 next 允许我们移动到下一行。最后的1 是一个awk 习惯用法,它触发默认操作,即打印。对于与我们的模式不匹配的所有行,我们按原样打印它们。由于它使用print,它为我们放置了换行符。
使用perl:
$ perl -pe 'chomp if $.==3' file
1
2
34
5
对于perl,我们使用两个选项。 -p 创建一个隐式 while(<>) { print } 循环来处理我们文件的每一行。 -e 告诉 perl 解释器执行它后面的代码。 perl 中的 $. 保存当前行号。 chomp 是一个内置函数,用于删除尾随换行符。因此,当我们的行号为 3 时,我们要求 perl 到 chomp 为我们换行。所有其他行都按原样打印。
【讨论】:
通过 perl,
perl -pe 's/\n// if $. == 11' file
要保存所做的更改,
perl -i -pe 's/\n// if $. == 11' file
示例:
$ cat file
1
2
3
4
$ perl -pe 's/\n// if $. == 3' file
1
2
34
【讨论】: