linux - 我需要从 Ubuntu 中删除 .txt 文件中以白色间距分隔的行的白色间距

标签 linux awk sed txt

enter image description here

你好!!

正如标题中所说,我需要删除仅由白色间距分隔成两行的白色间距,如图所示,具有绿线的白色间距是我需要的删除,但是带有红线的多个白色间距,我不想删除它们,带有绿线的,仅由一个白色间距分隔,我不知道使用 AWK 或 SED 或 CUT 是否有效,问题是我不知道该怎么做,谢谢你的帮助。

我尝试使用SED和AWK进行如下操作,但没有产生任何效果

awk -F, '{gsub("\n","",$1); print}' archivo.txt

sed 's/ //g' input.txt > no-spaces.txt

最佳答案

假设:

  • 输入文件有“\n”(而不是“\r\n”)行结尾。
  • 非空行至少包含两个字符。
  • 我们不必关心开头或结尾的空行 文件的内容。

如果支持 -z (slurp) 选项和 \n 表示法的 GNU sed 是 可用的。请你尝试一下:

sed -Ez "s/([^\n]\n)\n([^\n])/\1\2/g" input.txt > no-spaces.txt

input.txt 示例:

line1
line2 # following blank line should be removed

line3 # following blank lines should be kept



line4

输出:

line1
line2 # following blank line should be removed
line3 # following blank lines should be kept



line4

Sed 通常逐行处理输入。这就是为什么我们无法处理 跨多行输入。 -z 选项通过以下方式更改行为 将输入行分隔符设置为 NUL 字符。

  • ([^\n]\n) 匹配非空行的最后一个字符。 \1 设置为 bac 引用。
  • \n 是中间的空行(要删除)。
  • ([^\n]) 匹配以下非空行的第一个字符。 \2 是 设置为反向引用。

顺便说一句,在 bash 的帮助下,以下内容将适用于任何符合 POSIX 标准的 sed:

#!/bin/bash

# define newline character for replacement
NL=$'\\\n'

sed -E '
:l
N
$!b l
# first slurp all lines in the pattern space
# and perform the replacements over the lines
s/([^'"$NL"']'"$NL"')'"$NL"'([^'"$NL"'])/\1\2/g
' input.txt > no-spaces.txt

关于linux - 我需要从 Ubuntu 中删除 .txt 文件中以白色间距分隔的行的白色间距,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76807759/

相关文章:

c++ - 减少 Linux 中的每个线程内存

Python-无法打开库 'libtdsodbc.so' : file not found

linux - 如何创建没有不必要空格的 CSV 文件

bash - 根据输入文件批量创建名称和内容的文件

linux - 一个单词一个单词地搜索整行

linux - 在受限环境中运行外部代码(linux)

linux - 如何找到包含少量特定字符串但不一定在同一行的所有文件?

regex - sed 用下划线替换 2 个字符串之间的空格

regex - awk 模式匹配语法 c&&!--c

regex - sed 用 C++ 注释替换(单行)C 注释