regex - 如何在触发 "unterminated substitute pattern"错误的 bash 脚本中重新组织 sed 正则表达式中的嵌套引号?

标签 regex macos bash sed terminal

以下命令在 bash 中抛出一个未终止的替换模式错误:

eval $(echo "sed '" "s,@\("{a..u}{a..z}"\),\n\n\1,;" "'")

但并不适合所有人。 Linux 显然工作正常。 Mac 抛出未终止的替代模式错误。

我怎样才能重新组织以使其正常工作?

这是完整的 bash 命令(目的是将当前的 MySQL 设置干净地输出到 my.cnf 中):

{
  # Print version, user, host and time
  echo -e "# MYSQL VARIABLES {{{1\n##\n# MYSQL `
      mysql -V | sed 's,^.*\(V.*\)\, for.*,\1,'
      ` - By: `logname`@`hostname -f` on `date +%c`\n##"
  for l in {a..z}; do
      # Get mysql global variables starting with $l
      echo '#'; mysql -NBe "SHOW GLOBAL VARIABLES LIKE '${l}%'" |
      # Transorm it
      sed 's,\t,^= ,' |
      column -ts^ |
      tr "\n" '@' |
      eval $(echo "sed '" "s,@\("{a..u}{a..z}"\),\n\n\1,;" "'") |
      eval $(echo "sed '" "s,@\(innodb_"{a..z}{a..z}"\),\n\n\1,;" "'") |
      tr '@' "\n" |
      sed 's,^,# ,g'
  done
  echo -e "#\n##\n# MYSQL VARIABLES }}}1";
} | tee ~/mysql-variables.log

最佳答案

OS X 中的默认 sed 是 sed 的 BSD 版本。刚刚测试:

  • 以上在 OS X 的默认 sed 中失败,
  • 并使用 GNU 版本(gsed - 从 macports 安装)。

因此,BSD 版本可能无法处理如此长的替换命令系列。

你可以尝试使用下一个:

eval $(echo "perl -ple '" "s,@("{a..u}{a..z}"),\n\n\1,;" "'")

也许我没理解你的目标,但是更简单的目标有什么问题呢?

sed 's/@\([a-u][a-z]\)/\n\n\1/' #or
sed 's/@\("[a-u][a-z]"\)/\n\n\1/'

编辑

再一次,我只关注第一个代码行,而不是整个解决方案。因此创建了一个 bash/perl 版本,它可以在 OS X 上正常工作(使用默认的 OS X 工具)。

下一段代码

MYSQLCMD=/usr/local/mysql-5.6.16-osx10.7-x86_64/bin/mysql   #your path to mysql command

printf "# MYSQL VARIABLES {{{1\n##\n# MYSQL %s " "$($MYSQLCMD -V | sed 's/.*\(Ver .*\),.*/\1/')"
printf " - By: %s@%s on %s\n" $(logname) $(hostname -f) "$(date +%c)"

perl -e "\$s=qx($MYSQLCMD -NBe 'SHOW GLOBAL VARIABLES');" \
     -e 'for("aa".."uz"){$s=~s/^($_)/#\n$1/m;$s=~s/^(innodb_$_)/#\n$1/m};' \
     -e '$s=~s/(.*)\t(.*)/sprintf "# %-55s= %s",$1,$2/gem;print $s'

printf "#\n##\n# MYSQL VARIABLES }}}1\n";

与原始代码大致相同。

关于regex - 如何在触发 "unterminated substitute pattern"错误的 bash 脚本中重新组织 sed 正则表达式中的嵌套引号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24853398/

相关文章:

java - 正则表达式捕获单行注释

python - 在python中使用正则表达式捕获表情

c++ - Mac 库链接

Linux 自动启动

linux - 删除重复行但保留前 2 个实例

c 正则表达式找不到字符串

regex - 正则表达式 - 无法检查特殊字符 [ ]

ios - 可以使用带有 itms-services 的自签名 SSL 证书

c - 在 Swift 3 中使用具有回调函数指针作为参数的 C API 函数

linux - 列出目录中的文件名并将输出放在文本文件中