1

对不起,如果标题描述性不够,但我真的不知道如何总结它,欢迎任何建议。我写了一段有用的正则表达式来匹配 sql 文件中的行,将数据插入特定的表(包含缓存)。它是这样的:

(--\s--\sDumping\sdata\sfor\stable\s`(cache_\w+|cache)`.*?)(?=(--\n--.+Table\sstructure\sfor\stable\s`.+`.*--))

所以现在当我有这样的文件时:

--
-- Table structure for table `cache_content`
--

something

--
-- Dumping data for table `cache_content`
--

INSERT INTO `cache_content` etc.


--
-- Table structure for table `cache`
--

something

--
-- Dumping data for table `cache`
--

INSERT INTO `cache` etc.


--
-- Table structure for table `notcache`
--

something

--
-- Dumping data for table `notcache`
--

它将所有插入匹配到这些表,我想通过使用删除它们(因为那些是带有缓存的表)sed,特别是我为此编写了一个简单的 bash 脚本:

REGEX="(--\s--\sDumping\sdata\sfor\stable\s\`(cache_\w+|cache)\`.*?)(?=(--\n--.+Table\sstructure\sfor\stable\s\`.+\`.*--))"
sed -i "s/${REGEX}//g" $1

现在的问题是它在我的正则表达式测试器中工作,但它根本不适用于sed. sed根本不改变文件,我很困惑。我在某处读到sed基于行的内容,但这可能是问题所在,还是其他原因?

补充 #1:如果不可能用sed什么是好的选择来完成?有什么类似 sed 的东西可以做到吗?

4

4 回答 4

2

不,您不能使用sed它,因为它是面向行的,并且您的模式必须匹配多行。(您可以将您的模式分解为一个开始模式和一个结束模式并尝试/start_pattern/,/end_pattern/p,但是您需要start_pattern为每个表单独设置 s,因为输入中的行范围sed只能匹配一次。)

您应该能够在以下方面采用简化的开始模式/结束模式方法awk

awk 'BEGIN { x = 1 }; /^-- Dumping data for table `cache(_[a-zA-Z0-9]+)?`$/ { x = 0 }; /^-- Table structure for table `[^`]+`$/{ x = 1 }; (x == 1) { print }' $1

或者您仍然可以在“真实”脚本语言中采用您的一个巨大的正则表达式覆盖整个文件的方法(进行一些小的修改):

ruby -e 'File.write(ARGV[0],File.read(ARGV[0]).gsub(/(--\s--\sDumping\sdata\sfor\stable\s`(?:cache_\w+|cache)`.*?)(?=(?:--\n--\s+Table\sstructure\sfor\stable\s`[^`]+`\s*\n--))/m,""))' $1
于 2013-11-13T23:52:44.213 回答
1

如果一开始就可以避免,为什么还要创造额外的工作?:)

只需不要为您不感兴趣的表生成语句。例如,如果您使用的是 MySQL:

mysqldump --ignore-table=<...> --ignore-table=<...> 

其他数据库也有类似的选项。

于 2013-11-14T00:05:40.083 回答
0

尝试使用 perl,而不是 sed:

perl -e 'undef $/; $_ = <>; s/YOUR_REGEX_HERE//gs; print' $1
于 2013-11-13T23:51:16.883 回答
0

通过将所有内容保存在缓冲区中来启动您的 sed

sed "H
$ {
  x
#  your code here
  }
  1. H 将每一行加载到缓冲区中
  2. 当最后一行($)发生时
  3. 将当前行与缓冲区交换(因此所有文件都在您的工作区中)
  4. 您的代码适用于所有线路。

小心,^ 和 $ 是文件的第一个和最后一个字符,不再有由 \n 分隔的行

于 2013-11-14T07:55:49.287 回答