与 sed 交换单词

与 sed 交换单词

我需要帮助sed,实际上是 Linux 正则表达式:
我需要更改括号之间的两个参数,例如,如果该行是

 mysqli_select_db($par1, $par2)<br/>

我需要将其更改为

 mysqli_select_db($par2, $par1)<br/>

我需要一些通用的东西,它们并不总是会是par1par2

答案1

一种更迂腐的方法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 并关闭)

答案2

您可以使用:

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/>

答案3

这是基于您上面的示例的一个粗略示例。你当然可以适应。

关键是确定要反转的两个组并在第二部分中使用它们。

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

结果是

mysqli_select_db($par2, $par1)<br/>

相关内容