如何在触发"未终止替代模式"错误的bash脚本中重新组织sed正则表达式中的嵌套引号?

Rya*_*yan 4 regex macos bash terminal sed

以下命令unterminated substitute pattern在bash中抛出错误:

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

但不适合所有人.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
Run Code Online (Sandbox Code Playgroud)

jm6*_*666 5

sedOS X中的默认值是sed的BSD版本.刚测过:

  • OS X的默认sed中,上述内容失败,
  • 并使用GNU版本(gsed - 从macports安装).

因此,可能BSD版本不处理这样的长替换命令序列.

您可以尝试使用下一个:

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

也许我不明白你的目标,但更简单的是什么是错的?

sed 's/@\([a-u][a-z]\)/\n\n\1/' #or
sed 's/@\("[a-u][a-z]"\)/\n\n\1/'
Run Code Online (Sandbox Code Playgroud)

编辑

我再次专注于第一个代码行,而不是整个解决方案.因此创建了一个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";
Run Code Online (Sandbox Code Playgroud)

大致与原始代码完全相同.