Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 不使用';我不能和sed一起工作_Regex_Bash_Sed - Fatal编程技术网

Regex 不使用';我不能和sed一起工作

Regex 不使用';我不能和sed一起工作,regex,bash,sed,Regex,Bash,Sed,对不起,如果标题不够描述性,但我真的不知道如何总结它,欢迎任何建议。我编写了一段有用的正则表达式,用于匹配sql文件中的行,这些行将数据插入特定的表(包含缓存)。事情是这样的: (--\s--\sDumping\sdata\sfor\stable\s`(cache_\w+|cache)`.*?)(?=(--\n--.+Table\sstructure\sfor\stable\s`.+`.*--)) -- -- Table structure for table `cache_content`

对不起,如果标题不够描述性,但我真的不知道如何总结它,欢迎任何建议。我编写了一段有用的正则表达式,用于匹配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`
--
所以现在当我有这样的文件:

(--\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可以吗?

请尝试使用perl代替sed:

perl -e 'undef $/; $_ = <>; s/YOUR_REGEX_HERE//gs; print' $1
perl-e'undef$/;$=;这里是你的正则表达式//gs;打印“$1”

不,您不能使用
sed
,因为它是面向行的,并且您的模式必须跨多行匹配。(您可以将模式分为开始模式和结束模式,然后尝试使用
/start\u pattern/,/end\u pattern/p
,但是您需要为每个表分别使用
开始模式
,因为
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
或者,您仍然可以使用“真正的”脚本语言对整个文件方法使用一个ginormous regexp(稍作修改):

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

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

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

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

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

将所有内容都保存在缓冲区中,以便启动sed

sed "H
$ {
  x
#  your code here
  }
  • H将每行装入缓冲区
  • 当最后一行($)出现时
  • 将当前行与缓冲区交换(这样所有文件都在您的工作区中)
  • 您的代码可以在所有线路上工作

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

    分隔的行。
    sed
    是基于行的,这是您的问题之一,在正则表达式中使用
    \s
    \w
    可能会很困难。您可能想考虑使用Perl或其他脚本语言来代替BASH/SED。您也使用了LokHead,SeD不支持。谢谢您的建议,但这不是我的转储:)。有时候有人可以用默认的方式发送给我他的数据库转储,这样的脚本就很方便了?如果能成功我会很高兴的。你说得对,我的错,谢谢。我已经更正了答案,请参见上文。这个Ruby代码匹配字符串很好,但是如何从文件中删除匹配项呢?请加上这个好吗?不幸的是,我不懂Ruby,这段代码也可能对其他人有用。经过编辑,Ruby示例现在可以在位编辑该文件。(另外,这两个示例现在都删除了缓存表内容,而不是保留它们并删除所有其他内容!)这是一个非常方便的多行正则表达式替换片段:)。它鼓励我在bash之上学习Ruby或Python。非常感谢你!