Shell 打印两个匹配字符之间的变量行

Shell 打印两个匹配字符之间的变量行,shell,awk,sed,Shell,Awk,Sed,在上面的文本中,我想获取每个“遗嘱”之间的行 和“/>”,忽略其他。但是间隙线的数量是可变的, 我使用了下面的命令,但结果不准确 cat massive_data.txt Will 12 123 1234 12345 /> Liu 23 34 /> Will 1234 12345 /> Will 1234 12345 . . . 根据我的理解: cat文件名| sed-n'/Will/,/>/p'| grep-v“/>” 输出: Will 12 123 1234 123

在上面的文本中,我想获取每个“遗嘱”之间的行 和“/>”,忽略其他。但是间隙线的数量是可变的, 我使用了下面的命令,但结果不准确

cat massive_data.txt
Will
12
123
1234
12345
/>

Liu
23
34
/>

Will
1234
12345
/>

Will
1234
12345
.
.
.

根据我的理解:

cat文件名| sed-n'/Will/,/>/p'| grep-v“/>”

输出:

Will
12
123
1234
12345
/>

Will
1234
12345
/>
.
.
.

您可以像这样使用
awk

Will
12
123
1234
12345
Will
1234
12345
Will
1234
12345

说明:

  • $1==“Will”{p=1}
    :当第一列为“Will”时设置标志
    p=1
  • p{data=data$0rs}
    :如果
    p==1
    则继续将每行追加到变量
    data
  • $1==“/>”{打印数据;p=0;data=”“
    :如果第一列是
    />
    ,则打印
    数据
    ,并重置
    p
    数据
    变量

如果
/>
后面有一个空行,那么您也可以像这样使用
awk

Will
12
123
1234
12345
/>


Will
1234
12345
/>

RS
在空行拆分记录。脚本打印以
开头的记录将
并以
/>
结尾的记录。为什么不打印最后一个
起始块?因为它不以
/>
结尾?它如何结尾?
..
没有真正的帮助。是的,你是对的,我需要包含数据的“Will”和“/>”,…表示仍然有大量数据。如果您希望在每条记录后的空行添加
{print$0 ORS}
,在正则表达式后。非常感谢,先生,我尝试了您的方法并得到了预期的结果,您能解释一下为什么“RS”拆分记录是空的,以及代码中“&&&”的含义是什么吗“?默认情况下,awk中的记录是以换行符(
\n
)结尾的字符串。您可以通过将变量
RS
设置为希望标记记录结尾的任何值来更改该行为。
RS=”“
将记录结尾设置为空行(或多行)所以基本上,对于这些数据,一个记录是:
将…/>\n\n
&
是和。非常感谢,先生,我想知道你能否解释一下{p=1}p{data=data$0 RS}的意思在您的第一个代码中?我已经在我的答案中添加了解释。非常感谢,先生,在下面的命令中:awk-v ORS='\n\n'-v RS='/^Will/&&/\/>$/'文件是“-v”表示不匹配吗?
awk '$1 == "Will"{p=1} p{data = data $0 RS} $1 == "/>"{print data; p=0; data=""}' file
Will
12
123
1234
12345
/>


Will
1234
12345
/>
awk -v ORS='\n\n' -v RS= '/^Will/ && /\/>$/' file
$ awk 'BEGIN{RS=""}/^Will/&&/\/>/' file
Will
12
123
1234
12345
/>
Will
1234
12345
/>