Объединение двух команд sed

У меня есть файл r, Я хочу заменить слова File а также MINvac.pdb в этом ни с чем. Команды, которые я использовал

sed -i 's/File//g' /home/kanika/standard_minimizer_prosee/r

а также

sed -i 's/MINvac.pdb//g' /home/kanika/standard_minimizer_prosee/r

Я хочу объединить оба sed команды в одну, но я не знаю, как. Кто-нибудь может помочь?

Файл выглядит так:

-6174.27    File10MINvac.pdb
-514.451    File11MINvac.pdb
4065.68     File12MINvac.pdb
-4708.64    File13MINvac.pdb
6674.54     File14MINvac.pdb
8563.58     File15MINvac.pdb

2 ответа

Решение

sed это язык сценариев. Вы разделяете команды точкой с запятой или символом новой строки. Много sed диалекты также позволяют передавать каждую команду как отдельную -e опционный аргумент.

sed -i 's/File//g;s/MINvac\.pdb//g' /home/kanika/standard_minimizer_prosee/r

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

Для полноты вот вариант перевода строки. Многие новички озадачены тем, что оболочка допускает буквальные переводы строк в кавычках, но это может быть удобно.

sed -i 's/File//g
    s/MINvac\.pdb//g' /home/kanika/standard_minimizer_prosee/r

Конечно, в этом ограниченном случае вы также можете объединить все в одно регулярное выражение:

sed -i 's/\(File\|MINvac\.pdb\)//g' /home/kanika/standard_minimizer_prosee/r

(Немного sed диалекты захотят этого без обратной косой черты и / или предложат возможность использовать расширенные регулярные выражения, где они должны быть опущены. BSD sedи, следовательно, также MacOS sedтребует обязательного аргумента sed -i который, однако, может быть пустым, как sed -i ''.)

Использовать -e флаг:

sed -i -e 's/File//g' -e 's/MINvac.pdb//g' /home/kanika/standard_minimizer_prosee/r

Как только вы получите больше команд, чем удобно определить -es, лучше хранить команды в отдельном файле и включать их в -f флаг.

В этом случае вы создадите файл, содержащий:

s/File//g
s/MINvac.pdb//g

Давайте назовем этот файл "sedcommands". Затем вы бы использовали его с sed, как это:

sed -i -f sedcommands /home/kanika/standard_minimizer_prosee/r

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

Другие вопросы по тегам