Как заменить последнее вхождение с помощью `sed`
Команда `sed` используется в Linux для различных типов текстовых операций, таких как вставка, удаление, замена и т. д. С помощью команды `sed` можно легко выполнять различные типы задач замены. Любая задача замены может быть выполнена на основе искомого текста или шаблона. Искомый текст или шаблон может встречаться несколько раз в строке или файле, где будет выполняться поиск. Как вы можете заменить последнее вхождение искомого текста или шаблона, было показано в этом руководстве.
Замените последнее вхождение текста в строку:
В этом разделе показано, как можно заменить последнее вхождение шаблона поиска в строке с помощью команды `sed`.
Пример 1: заменить последнее вхождение слова на основе шаблона
Следующая команда `sed` будет искать слово 'PHP' в строке и заменять искомое слово словом 'AngularJS' , если слово существует в строке.
Следующий вывод появится после запуска команды. Здесь слово 'PHP' встречается в строке два раза, и последнее вхождение было заменено словом ' AngularJS'.
Пример 2: заменить последнее вхождение шаблона на основе цифр
Следующая команда `sed` будет искать любую цифру в строке и заменять последнюю цифру числом 9.
sed 's/\(.*\)[0-9])*/\19/'
Следующий вывод появится после запуска команды. Здесь цифра появляется в строке два раза, а последняя цифра, 4, заменена числом 9.
Пример 3: заменить последнюю цифру числа на основе шаблона
Следующая команда `sed` заменит последнюю цифру, существующую в строковом значении, на значение с двойным нулем (0 0).
Следующий вывод появится после запуска команды. Здесь в строковом значении существует 500. Итак, согласно команде замены, последний ноль 500 был заменен двумя двойными нулями, а замененное значение равно 5000.
Пример 4: заменить последнее вхождение слова другим словом
Следующая команда `sed` выполнит поиск слова «июнь» в строке и заменит последнее вхождение слова значением «май».
sed 's/\(.*\)Jun/\1May/' | tr ' ' '\n'
Следующий вывод появится после запуска команды. Здесь слово "июнь" встречается в строке два раза, и последнее вхождение заменено словом "май".
Заменить последнее вхождение текста в файле:
Создайте текстовый файл с именем Sales.txt со следующим содержимым, чтобы протестировать команду `sed`, используемую в этой части руководства, для замены последнего вхождения текста на основе шаблона.
Продажи.txt
January 2018 $ 200000
March 2019 $ 300000
April 2019 $ 150000
March 2020 $ 350000
May 2019 $ 210000
January 2020 $ 240000
Пример 5: заменить последнее вхождение слова другим словом
Следующая команда sed будет искать слово January в файле и заменять последнее вхождение этого слова на слово July.
$ sed '$ s/January/July/' Sales.txt
После выполнения команд появится следующий вывод. Слово "Январь" встречается в файле два раза. Последнее вхождение в 7й строке файла было заменено словом 'июль' в выходных данных.
Пример 6: заменить последнее вхождение числа другим числом
Команда `tac` используется для реверсирования содержимого файла. Команда `tac` используется с командой `sed` в следующей команде, чтобы заменить последнее вхождение '2019' на слово '2017'.
$ tac Sales.txt | sed '0,/2019/{s/2019/2017/}' | tac
После выполнения команд появится следующий вывод. Здесь значение года 2019 встречается в файле три раза. Первая команда 'tac' перевернула содержимое файла и отправила вывод в команду `sed`, чтобы заменить первое вхождение '2019'. который является последним вхождением в файле по значению года, '2017'. После замены вывод был отправлен команде `tac`, чтобы снова изменить вывод. Таким образом, последнее вхождение «2019» было заменено значением «2017».
Пример 7: заменить всю строку на основе последнего вхождения слова
Следующая команда `sed` заменит строку текстом с разделителями табуляции (\t), где строка начинается со строки 'Mar' в последний раз в файле. .
$ tac Sales.txt | sed '0,/^Mar.*/{s/^Mar.*/July\t\t2018\t$ 400000/}' | tac
После выполнения команд появится следующий вывод. Две строки в файле начинаются со строки 'Mar', а последнее вхождение этой строки появляется в 5й строке. Первая команда `tac` использовалась для реверсирования содержимого файла и отправки вывода команде `sed`. Команда `sed` заменила строку текстом ‘Jully 2018 $400000’, где искомая строка была найдена впервые. Вывод команды `sed` снова отправлен команде `tac`, чтобы отменить вывод, являющийся основным содержимым файла.
Заключение:
Команду `sed` можно использовать для замены любой части строки или строки файла различными способами, используя шаблоны регулярных выражений. В этом руководстве показаны способы замены последнего вхождения искомого текста в строке или файле с помощью нескольких команд `sed`. В этом руководстве также показано, как можно использовать команду `tac` с командой `sed` для замены последнего вхождения искомого текста. Но все используемые здесь команды будут временно генерировать выходные данные. Вы должны использовать параметр «-i» с командой «sed», чтобы навсегда изменить содержимое файла на основе шаблона.