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
说明:
:当第一列为“Will”时设置标志$1==“Will”{p=1}
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
/>