提问人:Moqtite 提问时间:11/3/2023 最后编辑:i-penrMoqtite 更新时间:11/10/2023 访问量:104
删除文本文件的结束行,但不要删除两个连续的结束行(空行)[重复]
Remove end line of a text file but don't remove two continuous end lines (blank lines) [duplicate]
问:
我有一个文本(来自 pdf),我想清理所有结束行,但没有空行,文本有结束行和断行,这是文本:
Lorem ipsum dolor sit amet, consectetur adipiscing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillu.
要清理尾行,我使用命令:awk
awk 1 ORS='' my_text.txt > new_text.txt
但结果是只有一行的文本。我的原始文本有 >2000 行,当我应用 awk 命令时,我有很长的一行,我的文本编辑器冻结了。
我想要没有结束行的段落,这是我想要的结果:
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillu.
我可以对 awk(或其他命令)使用什么条件来表示尊重段落(没有干净的空行)?
答:
0赞
mandy8055
11/3/2023
#1
您可以使用以下命令来实现您的目的:awk
awk 'BEGIN{RS=ORS="\n\n"} {gsub(/\n/," ")} 1' my_text.txt > new_text.txt
上述命令的解释:
BEGIN{RS=ORS=“\n\n”}
- 它将记录分隔符 (RS) 和输出记录分隔符 (ORS) 设置为双换行符(即),有效地将每个段落(用空行分隔)视为记录。\n\n
{gsub(/\n/,“ ”)}
- 这会将记录中的每个字符替换为 “ ”。如果你想用什么都没有代替,那么你可以用 “”。\n
1
- 简写{print $0}
注意:上面的命令适用于 GNU awk。如果您需要使用 awk 的解决方案,POSIX
awk '{printf "%s%s", (NR>1 && !NF ? "\n" : ""), $0; prevNF=NF} END{print ""}' my_text.txt > new_text.txt
您可以在下面找到上述命令的实现:
1赞
Ed Morton
11/3/2023
#2
使用任何 awk:
$ awk -v RS= -v ORS='\n\n' -F'\n' '{$1=$1} 1' file
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillu.
上面使用的构造执行以下操作:
RS=
- 设置为 null,告诉 awk 读取输入记录 用 1 个或多个空行分隔,而不是用换行符分隔。这被称为“段落模式”。RS
ORS='\n\n'
- 设置为 2 个换行符,在每条输出记录后放置一个空行。ORS
-F'\n'
- 设置为换行符,以便在通过将每个替换为 来重新构造时,制表符和空白链不会转换为单个空白字符(默认值为 )。FS
$0
FS
OFS
OFS
{$1=$1}
- 更新一个字段(到它自己),从而使 awk 从它的字段中重建,将它们与任何值分开。$0
OFS
1
- 一个 true 条件,导致 awk 执行其打印当前记录的默认操作,简写为 。{print $0}
-1赞
karakfa
11/3/2023
#3
sed
砍。
$ sed -Ez 's/\n\n/\n\n\n/g;s/\n([^\n])/\1/g' file
将预期的行尾设置为 null(而不是换行符)。将现有双换行符增加三倍,并删除所有单换行符。
评论