Awk 如何使用sed仅打印文件中紧跟空行的行?

Awk 如何使用sed仅打印文件中紧跟空行的行?,awk,sed,Awk,Sed,我有一个具有以下结构的文本文件: bla1 bla2 bla3 bla4 bla5 因此,您可以看到一些文本行前面有一个空行 我知道sed有两个缓冲区的概念,一个模式空间缓冲区和一个保持空间缓冲区,所以我猜这些需要在这里发挥作用,但我不清楚如何指定它们来完成我需要的 在我上面的人为示例中,我希望看到输出以下行: bla3 bla5 如果sed/awk不是强制性的,您可以使用grep: grep -A 1 '^$' input.txt | grep -v -E '^$|--' 如果se

我有一个具有以下结构的文本文件:

bla1
bla2

bla3
bla4

bla5
因此,您可以看到一些文本行前面有一个空行

我知道sed有两个缓冲区的概念,一个模式空间缓冲区和一个保持空间缓冲区,所以我猜这些需要在这里发挥作用,但我不清楚如何指定它们来完成我需要的

在我上面的人为示例中,我希望看到输出以下行:

bla3
bla5

如果sed/awk不是强制性的,您可以使用grep:

grep -A 1 '^$' input.txt  | grep -v -E '^$|--'

如果sed/awk不是强制性的,您可以使用grep:

grep -A 1 '^$' input.txt  | grep -v -E '^$|--'
您可以使用sed匹配一系列行,并在匹配中进行子匹配,如下所示:

# - use the "-n" option to omit printing of lines
# - match lines between a blank line (/^$/) and a non-blank one (/^./),
#   then print only the line that contains at least a character,
#   i.e, the non-blank line.
sed -ne '
/^$/,/^./ {
    /^./{ p; }
}' input.txt
您可以使用sed匹配一系列行,并在匹配中进行子匹配,如下所示:

# - use the "-n" option to omit printing of lines
# - match lines between a blank line (/^$/) and a non-blank one (/^./),
#   then print only the line that contains at least a character,
#   i.e, the non-blank line.
sed -ne '
/^$/,/^./ {
    /^./{ p; }
}' input.txt

可以很容易地使用保持缓冲器打印空白之前的行:

sed -n -e '/^$/{x; p;}' -e h input
但是我没有看到一种简单的方法可以将它用于您的用例。对于您的情况,您可以执行以下操作,而不是使用保持缓冲区:

sed -n -e '/^$/ba' -e d -e :a -e n -e p input
但我会用awk来做这件事


可以很容易地使用保持缓冲器打印空白之前的行:

sed -n -e '/^$/{x; p;}' -e h input
但是我没有看到一种简单的方法可以将它用于您的用例。对于您的情况,您可以执行以下操作,而不是使用保持缓冲区:

sed -n -e '/^$/ba' -e d -e :a -e n -e p input
但我会用awk来做这件事

上述命令对每行执行以下操作:

如果p为1,则打印行; 如果行为空,则将p设置为1。 如果由一个或多个空格组成的行也被视为空:

awk 'p;{p=!NF}' file
awk 'p*NF;{p=!NF}' file
要打印紧跟在空行之后的非空行,可以使用以下方法:

awk 'p*!(p=/^$/)' file
如果p为1且此行不是空的,则为1*!0=1*1=1,打印该行; 否则1*!1=1*0=0,0*anything=0,不要打印任何内容。 请注意,此版本可能不适用于所有AWK,其便携版本如下所示:

awk 'p*(/./);{p=/^$/}' file
如果由一个或多个空格组成的行也被视为空:

awk 'p;{p=!NF}' file
awk 'p*NF;{p=!NF}' file
在网上看到他们,然后

上述命令对每行执行以下操作:

如果p为1,则打印行; 如果行为空,则将p设置为1。 如果由一个或多个空格组成的行也被视为空:

awk 'p;{p=!NF}' file
awk 'p*NF;{p=!NF}' file
要打印紧跟在空行之后的非空行,可以使用以下方法:

awk 'p*!(p=/^$/)' file
如果p为1且此行不是空的,则为1*!0=1*1=1,打印该行; 否则1*!1=1*0=0,0*anything=0,不要打印任何内容。 请注意,此版本可能不适用于所有AWK,其便携版本如下所示:

awk 'p*(/./);{p=/^$/}' file
如果由一个或多个空格组成的行也被视为空:

awk 'p;{p=!NF}' file
awk 'p*NF;{p=!NF}' file

在线查看它们。

sed用于在单个行上执行s/old/new,仅此而已。每当你开始谈论缓冲区或做任何与多行比较相关的事情时,你都使用了错误的工具

您可以使用awk执行此操作:

$ awk -v RS= -F'\n' 'NR>1{print $1}' file
bla3
bla5
但是,如果文件中的第一行为空,它将无法打印第一个非空行,因此,如果希望所有空格字符的行都被视为空行,则这可能是您想要的:

$ awk 'NF && !p{print} {p=NF}' file
bla3
bla5
除此之外:

$ awk '($0!="") && (p==""){print} {p=$0}' file
bla3
bla5
即使在任何给定的非空行之前有多个空行,上述所有操作都将起作用

若要查看3种方法之间的差异,而这3种方法在给定问题中的示例输入时是看不到的:

PS1> printf '\nfoo\n      \nbar\n\netc\n' | cat -E
$
foo$
      $
bar$
$
etc$

PS1> printf '\nfoo\n      \nbar\n\netc\n' | awk -v RS= -F'\n' 'NR>1{print $1}'
etc

PS1> printf '\nfoo\n      \nbar\n\netc\n' | awk 'NF && !p{print} {p=NF}'
foo
bar
etc

PS1> printf '\nfoo\n      \nbar\n\netc\n' | awk '($0!="") && (p==""){print} {p=$0}'
foo
etc

sed用于在单个行上执行s/old/new,仅此而已。每当你开始谈论缓冲区或做任何与多行比较相关的事情时,你都使用了错误的工具

您可以使用awk执行此操作:

$ awk -v RS= -F'\n' 'NR>1{print $1}' file
bla3
bla5
但是,如果文件中的第一行为空,它将无法打印第一个非空行,因此,如果希望所有空格字符的行都被视为空行,则这可能是您想要的:

$ awk 'NF && !p{print} {p=NF}' file
bla3
bla5
除此之外:

$ awk '($0!="") && (p==""){print} {p=$0}' file
bla3
bla5
即使在任何给定的非空行之前有多个空行,上述所有操作都将起作用

若要查看3种方法之间的差异,而这3种方法在给定问题中的示例输入时是看不到的:

PS1> printf '\nfoo\n      \nbar\n\netc\n' | cat -E
$
foo$
      $
bar$
$
etc$

PS1> printf '\nfoo\n      \nbar\n\netc\n' | awk -v RS= -F'\n' 'NR>1{print $1}'
etc

PS1> printf '\nfoo\n      \nbar\n\netc\n' | awk 'NF && !p{print} {p=NF}'
foo
bar
etc

PS1> printf '\nfoo\n      \nbar\n\netc\n' | awk '($0!="") && (p==""){print} {p=$0}'
foo
etc

经gnu sed测试,您的数据在“a”中:

$ sed -nE '/^$/{N;s/\n(.+)/\1/p}' a
bla3
bla5

将-i选项添加到-n之前进行实际编辑

由gnu sed测试,您的数据在“a”中:

$ sed -nE '/^$/{N;s/\n(.+)/\1/p}' a
bla3
bla5

将-i选项添加到-n之前进行实际编辑

这是唯一一种在所有情况下都有效的解决方案,假设空行前面有空行,则不应打印空行。这是唯一一种在所有情况下都有效的解决方案,假设空行前面有空行,则不应打印空行欢迎来到StackOverflow。请在你的问题中包括你迄今为止的工作。通过向我们展示您正在使用的代码、预期结果和获得的结果,您将获得最佳帮助。欢迎使用StackOverflow。请在你的问题中包括你迄今为止的工作。通过向我们展示您正在处理的代码、您期望的结果和您得到的结果,您将获得最好的帮助。