Я написал сценарий, который принимает строки первого и второго параметров, а остальные параметры являются файлами. Идея сценария состоит в том, чтобы заменить первый параметр вторым в каждой строке каждого файла. Вот моя реализация, однако это не так. изменить содержимое файлов, но он печатает правильную информацию

first=$1
second=$2
shift 2
for i in $*; do
  if [ -f $i]; then
        sed -i -e 's/$first/$second/g' $i
  fi
done
1
Ivan Ivanov 28 Май 2017 в 13:07

2 ответа

Лучший ответ

Ваш скрипт не меняет файлы, потому что вы просто печатаете на стандартный вывод, а не на файл. Как бы вы это ни делали, вам понадобится новая переменная для хранения нового контента слово за словом, а затем перенаправить его в исходный файл (>).

Но вы можете сделать это просто с помощью sed, например так:

sed -i '' 's/original/new/g' file(s)

Объяснение :

sed - редактор потоков

-i '' означает, что он будет редактировать текущий файл и не будет создавать резервную копию

s/original/new/g означает заменить original слово или регулярное выражение на new слово или регулярное выражение. g означает глобальный = заменить все вхождения, а не только первый для каждой строки

file(s) - это все файлы, в которых выполняется замена. Может быть * для всех файлов в рабочем каталоге.

0
Joe Samanek 28 Май 2017 в 10:53

Вы использовали одинарную кавычку, чтобы заключить команду sed. Таким образом, особое значение знака доллара (расширение параметра) игнорируется и рассматривается как простой символ. Ознакомьтесь с руководством по bash:

Заключение символов в одинарные кавычки сохраняет буквальное значение каждого символа в кавычках. ... Заключение символов в двойные кавычки сохраняет буквальное значение всех символов в кавычках, за исключением $, `, \ и, когда расширение истории включено,!.

Вы должны заменить их двойными кавычками:

sed -i -e "s/$first/$second/g" $i
1
nix6 28 Май 2017 в 12:41