Подтвердить что ты не робот

Как проверить, заменила ли команда sed некоторую строку?

Эта команда заменяет старую строку новой, если таковая существует.

sed "s/$OLD/$NEW/g" "$source_filename" > $dest_filename

Как проверить, произошла ли замена? (или сколько раз было?)

4b9b3361

Ответ 1

- это не тот инструмент если вам нужно посчитать замену, будет лучше соответствовать вашим потребностям:

awk -v OLD=foo -v NEW=bar '
    ($0 ~ OLD) {gsub(OLD, NEW); count++}1
    END{print count " substitutions occured."}
' "$source_filename"

Это последнее решение учитывает только количество замененных строк. Следующий фрагмент подсчитывает все подстановки с . У этого есть преимущество, чтобы быть яснее, чем awk, и мы сохраняем синтаксис замены sed:

OLD=foo NEW=bar perl -pe '
    $count += s/$ENV{OLD}/$ENV{NEW}/g;
    END{print "$count substitutions occured.\n"}
' "$source_filename"

Изменить

Благодаря william, который нашел трюк $count += s///g для подсчета количества подстановок (даже или не в одной строке)

Ответ 2

Если вам свободно выбрать другой инструмент, например awk (как предлагается @sputnick), перейдите к другим инструментам. Awk мог подсчитать, сколько раз шаблон соответствовал.

sed сам не может считать замену, особенно если вы используете флаг /g. однако, если вы хотите придерживаться sed и знать время замены, есть возможности:

Один из способов -

grep -o 'pattern'|wc -l file && sed 's/pattern/rep/g' oldfile > newfile

вы также можете сделать это с помощью tee

cat file|tee >(grep -o 'pattern'|wc -l)|(sed 's/pattern/replace/g' >newfile) 

см. этот небольшой пример:

kent$  cat file
abababababa
aaaaaa
xaxaxa

kent$  cat file|tee >(grep -o 'a'|wc -l)|(sed 's/a/-/g' >newfile)
15

kent$  cat newfile                                               
-b-b-b-b-b-
------
x-x-x-

Ответ 3

Этот awk должен считать общее количество замен вместо числа строк, в которых произошли замены:

awk 'END{print t, "substitutions"} {t+=gsub(old,new)}1' old="foo" new="bar" file

Ответ 4

это сработало для меня.

awk -v s="OLD" -v c="NEW" '{count+=gsub(s,c); }1
END{print count "numbers"}
' opfilename