1

У меня есть большое количество файлов журналов, из которых мне нужно удалить конфиденциальные данные. Чувствительные данные предоставляются мне в текстовом файле и могут быть изменены.

Я надеялся сделать эквивалент этого:

#!/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 для этого? Или есть более подходящий путь?

Любая помощь приветствуется.

Стив

2 ответа2

2

Чтобы иметь возможность развернуть переменную оболочки в команде 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"
1

Да, sed - это путь.

Что я вижу неправильно в вашей команде sed - это кавычки. $ pattern не будет заменен его содержимым, если вы используете 'для цитирования. Вместо использования «вы должны использовать»:

sed -ri "s/$pattern/CLIENT/g" $1

Вам также нужен "-r" для расширенных регулярных выражений.

И pattern = $ pattern $ val "|" должно быть

pattern=$pattern"|"$val

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .