【问题标题】:How can I merge two specific lines with sed?如何用 sed 合并两条特定的行?
【发布时间】:2014-10-05 20:26:21
【问题描述】:

我有一个看起来像这样的文件

line one
line two
line three
line four

我希望它看起来像这样(我希望将第 2 行和第 3 行合并为一个)

line one
line two line three
line four

我尝试了以下方法,根据我的研究应该做我想做的事:

$ sed '2s/\n/ /' test.txt > test2.txt

然而test2.txt 看起来像这样

line one
line two
line three
line four

我已经看到一些关于它在 Solaris 上与 Linux 上不同的引用。这是我的服务器的详细信息

$ uname -a
SunOS myserver 5.10 Generic_142909-17 sun4u sparc SUNW,Sun-Fire-V490

我怎样才能让它得到我想要的结果?

【问题讨论】:

  • 请参阅this question,它解释了为什么使用 sed 有点困难。
  • 您要将第二行与第三行合并,还是将line twoline three 合并,无论它们在文件中的位置如何?
  • 它是基于行号,而不是行的值

标签: unix sed solaris


【解决方案1】:

根据链接问题中的答案,这个 sed 应该可以工作:

sed '2N;s/\n/ /' file

2N 表示在第二行,将下一行附加到模式空间。这导致模式空间包含line two\nline three。替换(将换行符\n 替换为空格)适用于文件中的每一行,但仅在此处有效。

否则,这个 awk 可以解决问题:

awk 'NR==2{printf("%s ",$0);next}1' file

在第二行,使用printf 打印该行的内容,后跟一个空格。 next 跳到下一行。对于所有其他行,末尾的 1 实际上是一个 {print $0} 块(打印该行)。

或者:

awk '{printf("%s%s",$0,NR==2?OFS:ORS)}' file

OFS 默认是空格,ORS 是换行符

或者一点perl:

perl -pe 's/\n/ / if $. == 2' file

$. 是行号。用换行符替换第 2 行的空格。

输出(在我的系统上使用上述任何一种方法):

line one
line two line three
line four

【讨论】:

  • 我得到 'awk: 第 1 行附近的语法错误' 'awk: 在第 1 行附近退出'
  • @CodeSlave 由于您使用的是 solaris,因此请使用 /usr/xpg4/bin/awk 而不是常规的 awk。此外,sed 将无法工作,因为 solaris sed 无法像 GNU 和其他变体那样识别 \n 字符。
  • @jaypal 那么^M(ctrl-v 返回)是否可以在 Solaris 上工作?
  • 好的,sed 和 perl 的例子已经足够我的目的了。
  • @CodeSlave 我在答案中添加了我的解释,希望能澄清。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
  • 2013-07-07
  • 1970-01-01
  • 2017-03-08
  • 1970-01-01
  • 2020-09-22
  • 1970-01-01
相关资源
最近更新 更多