Linux 用问号划线,并在前面划线-sed

Linux 用问号划线,并在前面划线-sed,linux,bash,shell,awk,sed,Linux,Bash,Shell,Awk,Sed,我有一些文本被传送到sed(任何其他工具都可以)。我想提取以问号结尾的那一行和前面的那一行。我们如何才能做到这一点 eg文本 & 434.0K - .... What are you trying to filter out of screencap's output? Student xcvdgfdg srrtgg 请您尝试以下内容,并让我知道这是否有助于您 awk '/\?$/{print prev ORS $0} {prev=$0}' Input_file 对于显示的输入

我有一些文本被传送到sed(任何其他工具都可以)。我想提取以问号结尾的那一行和前面的那一行。我们如何才能做到这一点

eg文本

& 434.0K
-

.... 
What are you trying to filter
out of screencap's output?
Student
xcvdgfdg
srrtgg

请您尝试以下内容,并让我知道这是否有助于您

awk '/\?$/{print prev ORS $0} {prev=$0}'  Input_file
对于显示的输入,以下是输出

What are you trying to filter
out of screencap's output?
在Solaris/SunOS系统上,将
awk
更改为
/usr/xpg4/bin/awk
/usr/xpg6/bin/awk
,或
nawk

代码说明:

/\?$/
:搜索以
结尾的行,如果是,则执行以下操作

{print prev ORS$0}
:在这里使用
awk
的print函数,通过该函数,我们在这里打印名为
prev
的变量和
$0
(当前行)的值


{prev=$0}
:因此,我将当前行的值存储到名为prev的变量中,以便在最后一行匹配
时,可以打印前一行。

请尝试以下操作,并让我知道这是否对您有帮助

awk '/\?$/{print prev ORS $0} {prev=$0}'  Input_file
对于显示的输入,以下是输出

What are you trying to filter
out of screencap's output?
在Solaris/SunOS系统上,将
awk
更改为
/usr/xpg4/bin/awk
/usr/xpg6/bin/awk
,或
nawk

代码说明:

/\?$/
:搜索以
结尾的行,如果是,则执行以下操作

{print prev ORS$0}
:在这里使用
awk
的print函数,通过该函数,我们在这里打印名为
prev
的变量和
$0
(当前行)的值

{prev=$0}
:因此,这里我将当前行的值存储到名为prev的变量中,以便在最后一行匹配
时,可以打印前一行。

sed解决方案:

sed -n '/?$/{x;G;p;};h'
粗略翻译:一般来说,不要打印任何东西。如果此行以“$”结尾,请在保留空间中以该行开头并打印。并将此行保存在保留空间中。

sed解决方案:

sed -n '/?$/{x;G;p;};h'

粗略翻译:一般来说,不要打印任何东西。如果此行以“$”结尾,请在保留空间中以该行开头并打印。并将该行保存在保留空间。

您可以使用
grep
匹配相关行,然后对匹配后的行使用
-A num
,或对匹配前的行使用
-B num

鉴于:

$ echo "$txt"
& 434.0K
-

.... 
What are you trying to filter
out of screencap's output?
Student
xcvdgfdg
srrtgg
前一行:

$ echo "$txt" | grep -B1 '\?$'
What are you trying to filter
out of screencap's output?
一行之后:

$ echo "$txt" | grep -A1 '\?$'
out of screencap's output?
Student
等等

支持POSIX和GNUGREP


如果有多个匹配项,
grep
将在每个匹配项之间放置
--

$ echo "$txt$txt" | grep -A1 '\?$'
out of screencap's output?
Student
--
out of screencap's output?
Student
如果这是一个问题,请通过管道
sed
将其删除:

$ echo "$txt$txt" | grep  -A1  '\?$' | sed  '/^--*$/d'
out of screencap's output?
Student
out of screencap's output?
Student

您可以使用
grep
匹配有问题的行,然后对匹配后的行使用
-A num
,或对匹配前的行使用
-B num

鉴于:

$ echo "$txt"
& 434.0K
-

.... 
What are you trying to filter
out of screencap's output?
Student
xcvdgfdg
srrtgg
前一行:

$ echo "$txt" | grep -B1 '\?$'
What are you trying to filter
out of screencap's output?
一行之后:

$ echo "$txt" | grep -A1 '\?$'
out of screencap's output?
Student
等等

支持POSIX和GNUGREP


如果有多个匹配项,
grep
将在每个匹配项之间放置
--

$ echo "$txt$txt" | grep -A1 '\?$'
out of screencap's output?
Student
--
out of screencap's output?
Student
如果这是一个问题,请通过管道
sed
将其删除:

$ echo "$txt$txt" | grep  -A1  '\?$' | sed  '/^--*$/d'
out of screencap's output?
Student
out of screencap's output?
Student
另一个sed解决方案

sed '$d;N;/?$/!D' infile
另一个sed解决方案

sed '$d;N;/?$/!D' infile


grep-B1'\?$”
Sean的那本书就是一个完美的答案@SeanBright您想发布答案吗?输出不理想。它在上下文的匹配项之间吐出一个
--
。堆栈溢出不是代码编写服务。请出示你的密码。由于堆栈溢出对您隐藏了关闭原因:寻求调试帮助的问题(“为什么此代码不工作?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:.
grep-B1'\?$”
Sean的这篇文章就是一个完美的答案@SeanBright您想发布答案吗?输出不理想。它在上下文的匹配项之间吐出一个
--
。堆栈溢出不是代码编写服务。请出示你的密码。由于堆栈溢出对您隐藏了关闭原因:寻求调试帮助的问题(“为什么此代码不工作?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:。当我试图在管道上使用此选项时,我正在运行此
xargs-i{}-0awk'/\?$/{print prev ORS$0}{prev=$0}{
但它抛出
awk:fatal:无法打开文件
&434.0K`@nithin,为什么要将此选项与
xargs
一起使用?请详细解释一下?我没有文件中的输出,我是从tesseract管道传输的。整个命令:
tesseract sc.png stdout | sed'/^$/d'| xargs-I{}-0awk'/\?$/{print prev ORS$0}{}{prev=$0}
@nithin,不明白这里的
xargs
有什么用?试着用single
awk
no after
sed
然后告诉我?当我试图在管道上使用它时,我正在运行这个
xargs-i{}-0awk'/\?$/{print prev ORS$0}{prev=$0}{/code>但它抛出
awk:fatal:无法打开文件
&434.0K nithin,为什么要用这个
xargs
?请详细解释一下?我没有文件中的输出,我是从tesseract管道传输的。整个命令:
tesseract sc.png stdout | sed'/^$/d'| xargs-I{}-0awk'/\?$/{print prev ORS$0}{}{prev=$0}
@nithin,不明白这里的
xargs
有什么用?在
sed
之后尝试使用single
awk
no,然后告诉我?虽然我的sed-n'H有点不同,但你还是击败了我$/{x;p};x'
。但它们实际上是一样的,这就是为什么我不发布答案。你比我抢先一步,尽管我的答案有点不同$/{x;p};x'。但它们实际上是一样的