У меня есть большое количество файлов журнала, из которых я должен удалить уязвимые данные. Уязвимые данные предоставляются мне в текстовом файле и подвержены изменению.
Я надеялся сделать эквивалент этого:
#!/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 для этого? Или есть ли более способный маршрут для взятия?
Любая справка ценится.
Steve
Смочь развернуть переменную оболочки в sed
команда, необходимо использовать двойные кавычки.
Любой необходимо использовать -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"
Да, sed является способом пойти.
Что я вижу неправильно в Вашей команде sed, кавычки. $pattern не будет заменен, он - содержание, если Вы используете 'для заключения в кавычки. Вместо того, чтобы использовать' необходимо использовать ":
sed -ri "s/$pattern/CLIENT/g" $1
Вам также нужен "-r" для расширенных регулярных выражений.
И $pattern$val pattern=" |" должен, вероятно, быть
pattern=$pattern"|"$val