首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sed读取文件,在特定行之前获取一个块。

sed读取文件,在特定行之前获取一个块。
EN

Stack Overflow用户
提问于 2020-11-17 07:32:14
回答 3查看 90关注 0票数 0

我正在处理一个文件

代码语言:javascript
复制
File: /var/log/audit/audit.log:
        /var/paas/sys/log/kubernetes/audit.log
        /var/paas/sys/log/csms-storagemgr/audit.log
File: /var/log/sudo.log: Good
File: /var/log/secure: Good

对于没有以“File:”开头的行,我需要将其与上面的行结合起来

预期结果将是

代码语言:javascript
复制
File: /var/log/audit/audit.log /var/paas/sys/log/kubernetes/audit.log /var/paas/sys/log/csms-storagemgr/audit.log
File: /var/log/sudo.log: Good
File: /var/log/secure: Good

如何使用sed或其他工具来实现这一目标?

我试过了

代码语言:javascript
复制
sed -ne '/File:/{:a;N;/File:/!{ba};s/\n/\t/g;p}' /tmp/test

但失败了。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-11-17 12:00:01

这可能对您有用(GNU sed):

代码语言:javascript
复制
sed -E '/^File:/{:a;N;/\nFile:/!s/\n\s*/ /;ta;P;D}' file

匹配以File:开头的一行。

追加下一行。

如果附加行没有开始File:,则将换行符和后面的任何其他空格替换为单个空格。

如果替换成功,则返回并追加下一行等。

否则,打印/删除模式空间中的第一行并再次开始sed循环。

注意:尝试使用N命令在文件结束后读取,将按您的预期进行,并打印当前行。

票数 2
EN

Stack Overflow用户

发布于 2020-11-17 12:57:14

对于GNU awk,假设空间的数量并不重要。

代码语言:javascript
复制
$ awk -v RS='File:' 'NF{$1=$1; print RS, $0}' ip.txt
File: /var/log/audit/audit.log: /var/paas/sys/log/kubernetes/audit.log /var/paas/sys/log/csms-storagemgr/audit.log
File: /var/log/sudo.log: Good
File: /var/log/secure: Good

  • RS='File:'File:设置为输入记录separator
  • NF,这样空记录就不再是基于输出字段分隔符的printed
  • $1=$1重建输入记录,这是由default
  • print RS, $0打印RS的值,然后是空格,然后是重建的输入记录

的值。

默认输入字段分隔符是单空格字符,它将删除前导/尾随空格/制表符/换行符,并根据这三个字符的一个或多个连续序列将记录拆分为字段。下面是另一个例子:

代码语言:javascript
复制
$ printf '    a  \t  b      3   '  | awk '{$1=$1; print}'
a b 3
票数 2
EN

Stack Overflow用户

发布于 2020-11-17 07:57:25

试试这个?

代码语言:javascript
复制
awk '/^File:/ && f { printf "\n" }
  { printf "%s", $0; f=1 }
  END { if (f) printf "\n" }' /tmp/test

这将省略每一行末尾的换行符,然后当它看到下一个File:行时将其添加回。注意,在完成所有输入行之后,请注意END块来添加最后一个换行符。

演示:https://ideone.com/SCfkx2

如果希望从行开始对空格进行规范化,请尝试在gsub(/^[ \t]+/, " ")之前添加printf "%s", $0

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64870968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档