假设我有一个带有警告的文件。换行中的ID带有 3个大写字母且仅3个数字的每个警告,都应替换为其ID。
示例:
SIM_WARNING[ANA397]: Node q<159> for vector output signal does not exist
输出应为ANA397,其余行将被删除。
如何使用sed?
答案 0 :(得分:0)
首先,您必须选择使用ID的方式,例如,如果您需要先循环文件或稍后再循环ID ...
E.G。 (首先循环文件)
exec 3<file
while read -r line <&3; do
id="$(printf "%s" "${line}" | sed -e "s/.*\[\([[:alnum:]]\+\)\].*/\1/")"
### Do something with id
done
exec 3>&-
否则,您可以决定循环sed的输出...
E.G。
for id in $(sed -e "s/.*\[\([[:alnum:]]\+\)\].*/\1/" file); do
### Do something with id
done
两个示例都应使用posix shell(如果我不缺少任何内容...),但是像posh
这样的shell可能不支持[[:alnum:]]
的类,您可以将它们替换为等效的类[a-zA-Z0-9]
,因为每个guide都会教你。
请注意,支票不是在3个字母和3个数字上,而是在方括号([
和]
)之间的任何字母和数字上。
编辑:
如果您的行以SIM_WARNING
开头,则可以用-e "/^SIM_WARNING/! d"
来区分这些行
要严格检查3个字母和3个数字,可以使用-e "s/.*\[\([a-zA-Z][a-zA-Z][a-zA-Z][0-9][0-9][0-9]\)\].*/\1/"
因此,以上面的示例为例,您可以执行以下操作:
for id in $(sed -e "/^SIM_WARNING/! d" -e "s/.*\[\([a-zA-Z][a-zA-Z][a-zA-Z][0-9][0-9][0-9]\)\].*/\1/" file)
### Do something with id
done
答案 1 :(得分:0)
我认为您不需要为此而烦恼。一个简单的带有--only-matching
的grep可以实现,如:
grep -E 'SIM_WARNING\[(.)\]' --only-matching
应该为您工作。
位置:
换句话说:通过使用(match)告诉grep您只关心该匹配模式中的内容。
答案 2 :(得分:0)
for id in $(grep -o "^SIM_WARNING\[[A-Z][A-Z][A-Z][0-9][0-9][0-9]\]" test1.bla | grep -o "[A-Z][A-Z][A-Z][0-9][0-9][0-9]" test1.bla ); do echo $id; done
这将从下面找到ANA397
。
SIM_WARNING[ANA397]: Node q<159> for vector output signal does not exist