Регулярное выражение для замены закрывающей кавычки в подстроках

Рейтинг: 1Ответов: 2Опубликовано: 12.01.2023

В каталоге текстовые файлы содержат вызов функции. Первый параметр - имя файла без расширения:

any_function( 'name_file', .... );

Задача: к значению первого параметра добавить расширение файла. Например:

any_function( 'name_file.php', .... );

Я пользуюсь bash и с простыми заменами справляюсь так:

find /dir -type f -print0 | xargs -0 sed -i 's/что_менять/на_что_менять/g' ;

Или использую программу regexxer. Могу в php прогнать файлы. Но не могу составить регулярное выражение для замены закрывающей кавычки "'" на ".php'" для вызовов этой функции. Прошу помочь!

Ответы

▲ 1

В sed используется особенная реализация регулярных выражений стандарта POSIX BRE/ERE (например, см. Регулярные выражения).

В вашем случае можно воспользоваться следующим выражением стандарта POSIX BRE:

sed "s/any_function( *'[^']*/&.php/"

См. пример в Bash:

#!/bin/bash
s="any_function( 'name_file', .... );"
sed "s/any_function( *'[^']*/&.php/" <<< "$s"
# => any_function( 'name_file.php', .... );

Подробности

  • any_function( - текст any_function( (в POSIX BRE ( является обчным символом)
  • * - ноль и более пробелов
  • ' - одинарная кавычка
  • [^']* - ноль и более символов, отличных от одинарной кавычки.

& указывает на текст целого совпадения.

▲ 0

Попробуйте awk:

cat file
any_function( 'name_file1', '142', 'ssa' );
any_function( 'name_file2', '1ww', 'jsa' );
any_function( 'name_file3', 'faf', 'spa' );

$ awk -F\' 'BEGIN {OFS=FS} {$2=$2".php"; print}' file
any_function( 'name_file1.php', '142', 'ssa' );
any_function( 'name_file2.php', '1ww', 'jsa' );
any_function( 'name_file3.php', 'faf', 'spa' );