如何移除ddcutil输出中指定区间的无效显示内容?sed尝试失败求解决方案
解决ddcutil输出中移除无效显示器信息的方法
我之前处理过类似的需求,默认sed的逐行处理模式对付这种跨多行的区块删除确实不太顺手,不过只要用对sed的地址范围匹配或者换用awk,就能轻松搞定。
方法1:使用sed删除目标区块
直接用sed匹配从Invalid display开头的行到下一个空行的范围,然后删除这个区间的内容:
ddcutil detect --verbose | sed '/^Invalid display/,/^$/d'
命令解释:
/^Invalid display/,/^$/:定义了一个匹配范围,从以Invalid display开头的行,一直到第一个空行(^$表示空行)d:删除这个范围内的所有行
如果你的无效区块结尾是包含空格或制表符的“空白行”(不是严格的空行),可以把空行匹配改成/^\s*$/(匹配零个或多个空白字符的行):
ddcutil detect --verbose | sed '/^Invalid display/,/^\s*$/d'
方法2:使用awk实现更直观的逻辑
awk的逐行处理逻辑更容易理解,我们可以通过标记变量来控制是否跳过行:
ddcutil detect --verbose | awk ' /^Invalid display/ { skip = 1 } # 遇到无效显示器开头,开启跳过标记 /^$/ { skip = 0 } # 遇到空行,关闭跳过标记 !skip { print } # 没有跳过标记时,打印当前行 '
这个脚本的逻辑是:当检测到Invalid display开头的行,就开始跳过后续内容;直到遇到空行,恢复打印有效内容。
效果示例
假设原输出是:
Display 1
VCP version: 2.2
Controller: DellInvalid display
Invalid I2C bus: /dev/i2c-3
DDC/CI not supportedDisplay 2
VCP version: 2.1
Controller: LG
经过上面任意一个命令处理后,输出会变成:
Display 1
VCP version: 2.2
Controller: DellDisplay 2
VCP version: 2.1
Controller: LG
内容的提问来源于stack exchange,提问作者Galih Dono Prabowo
相关产品推荐
相关产品推荐

