Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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 删除额外空间_Regex_Sed - Fatal编程技术网

Regex 删除额外空间

Regex 删除额外空间,regex,sed,Regex,Sed,cat myfile.sql DELIMITER $$ USE `AA4`$$ DROP TRIGGER /*!50032 IF EXISTS */ `AT_Card_INSERT_Trigger`$$ CREATE /*!50017 DEFINER='root'@'%' */ TRIGGER `AT_Card_INSERT_Trigger` AFTER INSERT ON `card` FOR EACH ROW BEGIN 以下内容按预期工作,并删除了defi

cat myfile.sql

DELIMITER $$

USE `AA4`$$

DROP TRIGGER /*!50032 IF EXISTS */ `AT_Card_INSERT_Trigger`$$

CREATE
    /*!50017 DEFINER='root'@'%' */
    TRIGGER `AT_Card_INSERT_Trigger` AFTER INSERT ON `card` 
    FOR EACH ROW BEGIN
以下内容按预期工作,并删除了definer子句

sed -e 's/DEFINER=[^*]*\*/\*/' myfile.sql
但它不适用于等号之后或之前的空格。例如,如果我有这样一句话

/*!50017 DEFINER = 'root'@'%' */
sed -e 's/DEFINER\ =\ [^*]*\*/\*/' myfile.sql
然后我需要一份sed声明,类似这样的

/*!50017 DEFINER = 'root'@'%' */
sed -e 's/DEFINER\ =\ [^*]*\*/\*/' myfile.sql
但是还有两种可能是空间(前面没有空间,后面没有空间)。也可能在“=”之前或之后有超过1个空格。
如何处理这些问题?

您只需添加
*
(一个空格后跟
*
)即可匹配零个或多个空格:

sed -e 's/DEFINER *= *[^*]*\*/\*/' myfile.sql
如果您使用的是OSX,您可以使用以下方法允许更多的空格,而不仅仅是空格:

# OSX
sed -E -e 's/DEFINER[[:space:]]*=[[:space:]]*[^*]*\*/\*/' myfile.sql
如果使用
-r
代替
-E
,GNUsed(1)也同样适用:

# GNU
sed -r -e 's/DEFINER[[:space:]]*=[[:space:]]*[^*]*\*/\*/' myfile.sql
GNUsed(1)也能理解
\s
中的空格:

# GNU
sed -r -e 's/DEFINER\s*=\s*[^*]*\*/\*/' myfile.sql

您只需添加
*
(一个空格后跟
*
)即可匹配零个或多个空格:

sed -e 's/DEFINER *= *[^*]*\*/\*/' myfile.sql
如果您使用的是OSX,您可以使用以下方法允许更多的空格,而不仅仅是空格:

# OSX
sed -E -e 's/DEFINER[[:space:]]*=[[:space:]]*[^*]*\*/\*/' myfile.sql
如果使用
-r
代替
-E
,GNUsed(1)也同样适用:

# GNU
sed -r -e 's/DEFINER[[:space:]]*=[[:space:]]*[^*]*\*/\*/' myfile.sql
GNUsed(1)也能理解
\s
中的空格:

# GNU
sed -r -e 's/DEFINER\s*=\s*[^*]*\*/\*/' myfile.sql

你已经知道如何使用克莱恩星;它也适用于空间:

sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' myfile.sql

它只处理空格。如果您还需要选项卡,请将它们也放入
[]
部分。如果你有一个了解
\s
的扩展sed,你甚至可以变得更花哨。

你已经知道如何使用Kleene star;它也适用于空间:

sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' myfile.sql

它只处理空格。如果您还需要选项卡,请将它们也放入
[]
部分。如果你有一个了解
\s
的扩展sed,你会变得更漂亮。

你的sed更好。没有括号。@Ray:不,你的括号更好,因为括号:P很难区分一个空格和两个空格。有时候,括号消除了任何歧义。你的更好。没有括号。@Ray:不,你的括号更好,因为括号:P很难区分一个空格和两个空格。有时,括号消除了任何歧义。单元素类不是必需的,但它们很好地澄清了单个空格。我习惯了括号,因为sed(至少在Mac上)没有
\s
,所以我经常写
[\t]
[\t\n\r]
:)总是有
perl-pe
sed-E
[:space:]]
。单元素类不是必需的,但它们很好地澄清了单个空格。我习惯了括号,因为sed(至少在Mac上)没有
\s
,所以我经常写
[\t]
[\t\n\r]
)总是有
perl-pe
sed-E
[:space:]