我有一个大的我需要从中删除敏感数据的日志文件数量。敏感数据以文本文件的形式提供给我,并且很容易发生变化。
我曾希望做与此相当的事情:
#!/usr/bin/bash
pattern=""
for val in 'sed -e 's/.*=//' Client_clean.txt
do
pattern=$pattern$val"|"
done
#egrep -e $pattern $1
sed -i 's/$pattern/CLIENT/g' $1
exit 0
注释掉的 egrep 工作正常,但 sed 却不行。
我使用 sed 做这件事对吗?或者有更合适的方法吗?
任何帮助均感激不尽。
史蒂夫
答案1
为了能够在sed
命令中扩展 shell 变量,您需要使用双引号。
您要么需要使用该-r
选项,sed
要么在管道字符前加上反斜杠。
您还需要避免在末尾添加竖线字符。如果在那里添加竖线字符,则会匹配空字符串。
#!/usr/bin/bash
pattern=""
delim=""
for val in 'sed -e 's/.*=//' Client_clean.txt
do
pattern=$pattern$delim$val
# setting delim after its first use and using it before the new value
# results in "foo|bar|baz" instead of "foo|bar|baz|"
delim='|'
done
sed -ri "s/$pattern/CLIENT/g" "$1"
答案2
是的,sed 是正确的方法。
我发现您的 sed 命令中的错误是引号。如果您使用 ' 进行引用,则 $pattern 将不会被其内容替换。您应该使用 " 而不是 ' :
sed -ri "s/$pattern/CLIENT/g" $1
您还需要“-r”来扩展正则表达式。
并且 pattern=$pattern$val"|" 可能应该是
pattern=$pattern"|"$val