regex - 如何根据下一行中存在的模式组合当前行和下一行。 (使用 awk)

标签 regex linux bash sed awk

我在这个网站上尝试了无数关于 awk 语法的建议,但不知何故我无法理解 awk..

只有当我的 expr 存在于下一行时,我才尝试合并两行(当前行和下一行)。

例如我有一个包含以下内容的文本文件:

<option value="1" selected> channel 1 
<div id="program_13" class="tree_3"><input type="checkbox" name="output_checkbox" value="13">&nbsp; &nbsp;Somename1</div>
<option value="2" selected> channel 2 
<div id="program_21" class="tree_3"><input type="checkbox" name="output_checkbox" value="21">&nbsp; &nbsp;Someothername</div>
<option value="3" selected> channel 3 
<option value="4" selected> channel 4 
<option value="5" selected> channel 5

只有当下一行中存在“output_checkbox”表达式时,我才想将当前行与下一行连接起来。这可能适用于所有或 5 条主线中的任何一条。

在上面的例子中,我想要的结果是:

<option value="1" selected> channel 1 <div id="program_13" class="tree_3"><input type="checkbox" name="output_checkbox" value="13">&nbsp; &nbsp;Somename1</div>
<option value="2" selected> channel 2 <div id="program_21" class="tree_3"><input type="checkbox" name="output_checkbox" value="21">&nbsp; &nbsp;Someothername</div>
<option value="3" selected> channel 3 
<option value="4" selected> channel 4 
<option value="5" selected> channel 5

我希望通过使用 sed(我认为我可以处理)在最后得到以下结果:

channel 1: Somename1
channel 2: Someothername
channel 3: 
channel 4: 
channel 5:

期待您的建议

最佳答案

尝试这一行:

awk '/output_checkbox/{printf "%s",$0;next}{printf (NR>1?"\n%s":"%s"), $0}END{print ""}' file

小测试:

kent$  cat f
<option value="1" selected> channel 1 
<div id="program_13" class="tree_3"><input type="checkbox" name="output_checkbox" value="13">&nbsp; &nbsp;Somename1</div>
<option value="2" selected> channel 2 
<div id="program_21" class="tree_3"><input type="checkbox" name="output_checkbox" value="21">&nbsp; &nbsp;Someothername</div>
<option value="3" selected> channel 3 
<option value="4" selected> channel 4 
<option value="5" selected> channel 5

kent$  awk '/output_checkbox/{printf "%s",$0;next}{printf (NR>1?"\n%s":"%s"), $0}END{print ""}' f 
<option value="1" selected> channel 1 <div id="program_13" class="tree_3"><input type="checkbox" name="output_checkbox" value="13">&nbsp; &nbsp;Somename1</div>
<option value="2" selected> channel 2 <div id="program_21" class="tree_3"><input type="checkbox" name="output_checkbox" value="21">&nbsp; &nbsp;Someothername</div>
<option value="3" selected> channel 3 
<option value="4" selected> channel 4 
<option value="5" selected> channel 5

关于regex - 如何根据下一行中存在的模式组合当前行和下一行。 (使用 awk),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19055086/

相关文章:

php - 使用 regex/php 读取引号内的文本

java - 在 arch linux 上运行 PyCharm

C++ 执行脚本 Aprog 命令未找到

python - 从字母组合生成字符串的最佳选择是 python 还是 bash?

python - 将复杂的 str 更改为 pandas Dataframe 中的 float

Python 正则表达式解析器

正则表达式:如何从最后一个括号中提取文本

linux - 查看 screen 上运行的代码?

linux - 如何找出目录或文件所在的挂载/分区? (Linux 服务器)

c++ - 使用 exec 在 C++ 中执行 shell 命令