【问题标题】:How can I split a line in 2 by words/characters?如何按单词/字符将一行分成 2 行?
【发布时间】:2015-06-05 09:18:00
【问题描述】:

我想转换:

Hello Hello Hi Hello Hello Hi Hi Hi Hi Hello

进入:

Hello Hello Hi Hello
Hello Hi Hi Hi Hi Hello

我想将一行分成 2 行,让它们的字符数量尽可能接近,而不用截断一个单词。

我想我可以用wc -wwc -ccut 和/或awk 来做,但也许你们可以提供一些更好的想法!

【问题讨论】:

  • 这个问题在 AskUbuntu 上交叉发布:askubuntu.com/questions/603739/…
  • 这不是正则表达式的东西,至少不是纯表达式。你最好用空格分割,计算单词的总数,并找到最接近原始字符串中点的空格(然后用换行符替换它,显然)。不过,不确定 awk 对它的友好程度……
  • @ericramos1990 这通常被认为是一件坏事。例如,请参阅:here。一个原因是很可能会浪费回答问题的人的时间。
  • 抱歉,我会牢记在心,谢谢。
  • 在这种特定情况下,由于答案不同,因此交叉发布并不是那么糟糕,并且我学会了命令fold

标签: string bash awk cut wc


【解决方案1】:

这可能是fold 的工作,这是一个方便的换行工具:

$ s="Hello Hello Hi Hello Hello Hi Hi Hi Hi Hello"
$ fold -w $(( ${#s} / 2 + 1)) -s <<< "$s"
Hello Hello Hi Hello
Hello Hi Hi Hi Hi Hello

这使用fold 将每一行包装成给定的长度。我们如何计算长度?只需使用${#variable} 并除以 2(如果长度为奇数,则 +1 以防止获得三行)。然后我们使用-s 来防止断词。

来自man fold

fold - wrap each input line to fit in specified width

   -s, --spaces
          break at spaces

   -w, --width=WIDTH
          use WIDTH columns instead of 80

【讨论】:

  • 完美,谢谢,我会研究折叠,我从来没有听说过!出于好奇,它在 Linux 发行版中是否可移植和/或经常使用?
  • 我不知道它的便携性,但例如我什至可以在 cygwin 中找到它。所以看起来很多。
  • 你应该知道fold折叠在字节而不是字符
  • 不,fold 在既不是字符也不是字节的屏幕列上折叠(例如,制表符可以是多列,退格字符将计为 -1 列位置)。但是,如果给定 -b 参数,它可以折叠字节。 fold 是一个核心 UNIX 工具,如 grep、sed、tr 等,因此应该随处可用。
  • @EdMorton 我的意思是fold 不能处理宽字符。在这方面你的说法也是错误的。
猜你喜欢
  • 1970-01-01
  • 2019-12-23
  • 1970-01-01
  • 2019-11-07
  • 2013-05-26
  • 2014-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多