Поиск по сайту:

Как заменить последнее вхождение с помощью `sed`


Команда `sed` используется в Linux для различных типов текстовых операций, таких как вставка, удаление, замена и т. д. С помощью команды `sed` можно легко выполнять различные типы задач замены. Любая задача замены может быть выполнена на основе искомого текста или шаблона. Искомый текст или шаблон может встречаться несколько раз в строке или файле, где будет выполняться поиск. Как вы можете заменить последнее вхождение искомого текста или шаблона, было показано в этом руководстве.

Замените последнее вхождение текста в строку:

В этом разделе показано, как можно заменить последнее вхождение шаблона поиска в строке с помощью команды `sed`.

Пример 1: заменить последнее вхождение слова на основе шаблона

Следующая команда `sed` будет искать слово 'PHP' в строке и заменять искомое слово словом 'AngularJS' , если слово существует в строке.

$ echo "Java PHP Bash Python JavaScript PERL PHP Laravel" |
sed 's/\(.*\)PHP/\1AngularJS/'

Следующий вывод появится после запуска команды. Здесь слово 'PHP' встречается в строке два раза, и последнее вхождение было заменено словом ' AngularJS'.

Пример 2: заменить последнее вхождение шаблона на основе цифр

Следующая команда `sed` будет искать любую цифру в строке и заменять последнюю цифру числом 9.

$ echo "The first counter value 2. The second counter value 4" |
 sed 's/\(.*\)[0-9])*/\19/'

Следующий вывод появится после запуска команды. Здесь цифра появляется в строке два раза, а последняя цифра, 4, заменена числом 9.

Пример 3: заменить последнюю цифру числа на основе шаблона

Следующая команда `sed` заменит последнюю цифру, существующую в строковом значении, на значение с двойным нулем (0 0).

$ echo "The product price is $ 500." | sed 's/\(.*\)[0-9]/\100/'

Следующий вывод появится после запуска команды. Здесь в строковом значении существует 500. Итак, согласно команде замены, последний ноль 500 был заменен двумя двойными нулями, а замененное значение равно 5000.

Пример 4: заменить последнее вхождение слова другим словом

Следующая команда `sed` выполнит поиск слова «июнь» в строке и заменит последнее вхождение слова значением «май».

$ printf "%s\n" Jan Feb Jun Apr Jun Dec | tr '\n' ' ' |
 sed 's/\(.*\)Jun/\1May/' | tr ' ' '\n'

Следующий вывод появится после запуска команды. Здесь слово "июнь" встречается в строке два раза, и последнее вхождение заменено словом "май".

Заменить последнее вхождение текста в файле:

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

Продажи.txt

Month       Year    Amount
January     2018    $ 200000
March           2019    $ 300000
April           2019    $ 150000
March           2020    $ 350000
May         2019    $ 210000
January     2020    $ 240000

Пример 5: заменить последнее вхождение слова другим словом

Следующая команда sed будет искать слово January в файле и заменять последнее вхождение этого слова на слово July.

$ cat Sales.txt
$ sed '$ s/January/July/' Sales.txt

После выполнения команд появится следующий вывод. Слово "Январь" встречается в файле два раза. Последнее вхождение в 7й строке файла было заменено словом 'июль' в выходных данных.

Пример 6: заменить последнее вхождение числа другим числом

Команда `tac` используется для реверсирования содержимого файла. Команда `tac` используется с командой `sed` в следующей команде, чтобы заменить последнее вхождение '2019' на слово '2017'.

$ cat Sales.txt
$ tac Sales.txt | sed '0,/2019/{s/2019/2017/}' | tac

После выполнения команд появится следующий вывод. Здесь значение года 2019 встречается в файле три раза. Первая команда 'tac' перевернула содержимое файла и отправила вывод в команду `sed`, чтобы заменить первое вхождение '2019'. который является последним вхождением в файле по значению года, '2017'. После замены вывод был отправлен команде `tac`, чтобы снова изменить вывод. Таким образом, последнее вхождение «2019» было заменено значением «2017».

Пример 7: заменить всю строку на основе последнего вхождения слова

Следующая команда `sed` заменит строку текстом с разделителями табуляции (\t), где строка начинается со строки 'Mar' в последний раз в файле. .

$ cat Sales.txt
$ 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», чтобы навсегда изменить содержимое файла на основе шаблона.

Статьи по данной тематике: