【问题标题】:delete end to line and no new paragraph [closed]逐行删除,没有新段落[关闭]
【发布时间】:2015-12-08 21:51:21
【问题描述】:

我有以下数据,需要全部放在格式段中。

Don Quixote has inspired many artists
in different fields. It is considered mainly to 
be a comedy. However, woven into the tale is a lot of Spain's 
history. Don Quixote's name even penned a type of psychosis.

In fact, anyone who has had experience with the mentally ill 
may find it difficult to regard Don Quixote as a comedy. After 
all, he was not totally harmless.

"A man attacked a driver because he believed he was abducting a 
woman, who was traveling in another car on the same road. 

After injuring the driver, the suspect's accomplice then 
forced the driver to remove his clothes and give them to 
him"--if this was reported on the news, we would probably 
e horrified. Here was an innocent person, just going about 
his business, who had no connection to the other people who 
were on the same road--and he gets attacked by a madman 
whose delusions cause him to believe a different reality.

我需要这个:

堂吉诃德启发了不同领域的许多艺术家。它主要被认为是一部喜剧。然而,融入这个故事的是西班牙的许多历史。堂吉诃德的名字甚至写下了一种精神病。

事实上,任何有精神病经历的人都可能会觉得很难将堂吉诃德视为一部喜剧。毕竟,他也不是完全无害的。

“一名男子袭击了一名司机,因为他认为他绑架了一名在同一条路上乘坐另一辆车的女子。

犯罪嫌疑人的同伙在打伤司机后,又强迫司机脱下衣服交给他”——如果这件事被新闻报道,我们估计会吓一跳。这是一个无辜的人,只是四处走动他的生意,与在同一条路上的其他人没有任何关系——他被一个疯子袭击,他的妄想使他相信一个不同的现实。

【问题讨论】:

  • 根据您的示例输出,我假设您需要以下内容:通过将每个段落内部换行符替换为单个空格,将每个段落展平为一行。如果是这样,请在您的问题中明确说明这一点(或您的真实要求),这将使其足够具体以成为重新开放的候选人。

标签: bash shell paragraph


【解决方案1】:

不是

fmt file

做你想做的事?

【讨论】:

  • ++ 指向fmt,但是,据我了解,行长应该有no限制,所以你必须使用@987654323 @,使用 GNU fmt 将您限制为 2500; BSD fmt 不会强制执行这样的任意限制,但我还没有测试过它在实践中切断的位置。
【解决方案2】:

注意:假设是您想要:

  • 原则上保留段落
  • 但通过将每个段落内部换行符替换为单个空格,将每个段落扁平化为 单个行。

有几个选项

  • 使用fmt,正如user1934428's answer 建议的那样,行长不受限制

    • 警告fmt 需要一个特定的数字作为目标行长度,并且使用 GNU fmt(至少从 coreutils v8.24 开始)该值的上限为 2500,这可能不够大,具体取决于您的需求:fmt -w 2500 file
      BSD fmt,相比之下,显然接受任意大的数字,但我不知道在实践中它在哪里切断。
  • 使用awk,如下所示。

    • 注意:这会将任何段落内部运行的制表符和空格规范化为每个空格。
  • 如果你安装我的whitespace-normalizing nws CLI,你可以简单地使用nws --fp file

    • 注意:这会将任何段落内部运行的制表符和空格规范化为每个空格。

awk解决方案

awk -v RS= '
  BEGIN { OFS=" "; ORS="\n\n" }
  NR > 1 { print "" }
  { $1 = $1; printf "%s", $0 }
  END { printf "\n" }
' file
  • -v RS=,即将输入记录分隔符设置为空字符串,是一种 Awk 习惯用法,它使 Awk 将连续的非空行 - 段落 - 单个记录视为运行。

  • OFS=" " 将输出字段分隔符设置为单个空格。

  • ORS="\n\n" 将输出-记录分隔符设置为 2 个换行符。

  • $1 = $1 是一种通过将字段(通过任何空格分割记录获得)与OFS 连接来强制重建输入记录的技巧,在这种情况下,OFS 有效地替换了每个块内部的换行符有空格; printf "%s", $0 首先打印重建的行没有 ORS(见下文)。

    • 注意:任何连续的空格和/或制表符也将替换为单个空格。
  • NR > 1 { print "" } 延迟打印 ORS 一行,因此 ORS 不会在末尾自动打印,这将导致 2 尾随 \n 字符。 { printf "\n" },在 END 块中,然后打印单个尾随 \n

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 2013-02-22
    相关资源
    最近更新 更多