SED命令替换

时间:2018-09-06 10:04:51

标签: linux bash sed csh

假设我有一个带有警告的文件。换行中的ID带有 3个大写字母且仅3个数字的每个警告,都应替换为其ID。

示例:

SIM_WARNING[ANA397]: Node q<159> for vector output signal does not exist

输出应为ANA397,其余行将被删除。

如何使用sed?

3 个答案:

答案 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 

应该为您工作。

位置:

  • -E会“增强正则表达式。我认为我们需要用()捕获的表达式
  • 然后遵循该模式,该模式由固定的SIM_WARNING组成,后跟方括号内的 match
  • -仅匹配仅使grep打印仅匹配内容

换句话说:通过使用(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