ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)

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

Как заменить все после шаблона с помощью команды `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 "Первое значение счетчика 2. Второе значение счетчика 6" |
sed 's/\(.*\)[0-9])*/\19/'

 

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

 

Пример 3: замена последней цифры числа по шаблону

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

$ echo "Цена товара 1000." | sed 's/\(.*\)[0-9]/\100/'

 

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

 

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

Следующая команда sed будет искать слово ‘Jun’ в строке и заменять последнее вхождение слова значением ‘May’.

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

 

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

 

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

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

Sales.txt

Месяц Год Сумма
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/Январь/Июль/' Sales.txt

 

Следующий вывод появится после выполнения команд. Слово «January» встречается в файле два раза. Последнее вхождение, которое существует в 7- й строке файла, было заменено словом «July» в выводе.

 

Пример 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 для постоянного изменения содержимого файла в зависимости от шаблона.

Exit mobile version