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

jk9hmnmh  于 2023-08-03  发布在  Linux
关注(0)|答案(3)|浏览(130)

enter image description here
你好!
正如标题中所说,我需要删除仅由两行白色间距分隔的白色间距,正如您在图像中看到的,具有绿色线条的白色间距是我需要删除的,但是具有红色线条的多个白色间距,我不想删除它们,具有绿色线条的白色间距仅由白色间距分隔,我不知道如果与AWK或SED或削减将工作,问题是,我不知道如何做到这一点,谢谢您的帮助。
我试着用SED和AWK做了如下操作,但没有产生任何效果

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

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

字符串

rxztt3cl

rxztt3cl1#

假设条件:

  • 输入文件的行尾为“\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 kreference。
  • \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

neekobn8

neekobn82#

这可能对你有用(GNU sed):

sed -E '1N;:a;N;/(\S.*\n)\n(.*\S)/{s//\1\2/;N;ba};P;D' file

字符串
打开3行窗口。
如果两个非空行夹着一个空行,则删除空行并保持3行窗口。
否则,打印/删除第一行并重复。
注意:1N确保创建3行窗口,替换后的N同样确保这一点。

xxls0lw8

xxls0lw83#

对于任何POSIX awk

awk '/^[[:space:]]*$/{n++; p=$0; next} {if(n==1) print p; print; n=0}' file

字符串
如果当前行只包含空格(/^[[:space:]]*$/),则递增变量n,将当前行存储在变量p中,并移动到下一行(next)。否则(当前行包含非空格字符),如果n==1打印存储在变量p中的前一个空行,则打印当前行并重置n
注意:如果最后一行只包含空格,并且前面有一行包含非空格字符,则不会打印。如果必须打印,请尝试:

awk '/^[[:space:]]*$/{n++; p=$0; next} {if(n==1) print p; print; n=0}
  END {if(n==1) print p}' file


注意:如果只想删除空行,请将^[[:space:]]*$/替换为/^$/

相关问题