Замена слов с помощью sed

xargs помогает выполнять команды в строках вывода, например:

find. -name '*.mp3' | xargs mp3info

для каждого файла, найденного с помощью find (, т.е. строка вывода)

mp3info <filename>

выполняется

Если вы хотите что-то сделать с целыми выводами find, вам вообще не нужны xargs.

0
12.07.2019, 01:02
3 ответа

Более педантичный подход сsed:

sed 's/\(mysqli_select_db(\)\([^,]*\)\(,[[:space:]]*\)\([^)]*\))/\1\4\3\2)/g' file
  • s/замена
  • \(начать захват группы 1
  • mysqli_select_db(соответствует литеральной строке
  • \)концевая группа захвата 1
  • \(начать захват группы 2
  • [^,]*соответствует любому символу запятой, отличному от -
  • \)концевая группа захвата 2
  • \(начать захват группы 3
  • ,[[:space:]]*соответствует запятой и необязательным символам пробела
  • \)концевая группа захвата 3
  • \(начать захват группы 4
  • [^)]*соответствует любым символам, отличным от-)
  • \)концевая группа захвата 4
  • )закрытие )команды
  • /\1\4\3\2)/gзаменить на захват групп 1, 4, 3, 2 и закрытие)
4
28.01.2020, 02:15

Это грубый пример, основанный на приведенном выше примере. Можно, конечно, приспособиться.

Суть в том, чтобы определить две группы, которые вы хотите инвертировать, и использовать их во второй части.

$ echo 'mysqli_select_db($par1, $par2)<br/>' | sed 's/mysqli_select_db(\(.*\), \(.*\))/mysqli_select_db(\2, \1)/'

приводит к

mysqli_select_db($par2, $par1)<br/>
1
28.01.2020, 02:15

Вы можете использовать:

sed -E 's/(.*\()(.*), (.*)(\).*)/\1\3, \2\4/g' file_name

напр.

echo 'mysqli_select_db($par1, $par2)<br/>' | sed -E 's/(.*\()(.*), (.*)(\).*)/\1\3, \2\4/g'

выдаст вывод как:

mysqli_select_db($par2, $par1)<br/>
1
28.01.2020, 02:15

Теги

Похожие вопросы