sed 正则表达式问题

sed 正则表达式问题

我正在尝试替换文件中的字符串:

$RELEASE     = '1234';

RELEASE 和 = 符号之间的空格可以是空格或制表符。版本号周围的引号可以是单引号,也可以是双引号。

我目前假设空格和单引号只是为了让它工作:

sed 's/$RELEASE[[:space:]]*\=[[:space:]]*'\''[0-9]*'\'';/$RELEASE = '\''1234'\'';/g' config.ini > config.ini

因此,经过大量工作后,这是有效的。但前提是字符串是空格(与制表符相对)并且单引号与双引号相对。这是我迄今为止尝试解决选项卡的内容......:

sed 's/$RELEASE([[:space:]]|\t)*\=([[:space:]]|\t)*'\''[0-9]*'\'';/$RELEASE = '\''1234'\'';/g' config.ini > config.ini

我刚刚读到大多数 sed 正则表达式不支持 /t...这是真的吗?是否有 [[:tab:]] 类型替换? (我确实尝试过)

任何帮助,将不胜感激。

答案1

我没有任何问题[[:space:]]。这是一个非常愚蠢的小示例,显示了空格和制表符的混合替换:

$ echo -e 'A \t \t B' | sed 's/A[[:space:]]*B/WORKED/'
WORKED

您还可以使用\s通常更适合大sed字符串的方法,因为它更短:

$ echo -e 'A \t \t B' | sed 's/A\s*B/WORKED/'
WORKED

不管怎样,我认为你的实际问题是逃避那些麻烦的单引号。我发现最简单的方法是打破单引号字符串并使用双引号单引号,然后(如果需要)返回单引号行。 Bash 会自动为您连接这一切。

$ echo 'This is a nice string and this is a single quote:'"'"' Nice?'
This is a nice string and this is a single quote:' Nice?

因此,我们节省的所有空间\s都将被这种巨型报价情况所破坏:

$ echo -e '$RELEASE  \t = '"'"'1234'"'"';' |\
  sed 's/$RELEASE\s*=\s*'"'"'[0-9]*'"'"'\;/REPLACEMENT/'

当然,有一个论点认为(因为这看起来像一个 PHP 脚本)您可能可以假设,如果该行以 开头,$RELEASE[\s=]+您可以替换整行。显然并不总是如此(整个应用程序可能是一条丑陋的线),但它使您的搜索和替换更令人愉快:

sed 's/$RELEASE[\s=]*.*/REPLACEMENT/'

是的,一般sed使用规则适用。不要回显到流编辑器(如sed)并重定向回该文件。如果它有效,您可以轻松地破坏该文件。

使用-i参数(适用于sed)或通过管道输入像海绵这样的应用程序(这就像延迟输出):

sed -i '...' file
sed '...' file | sponge file

答案2

您可以对表达式进行分组并使用\1来指向该组。例如

sed 's/^\($RELEASE.*=\).*/\1 '"'1234'"'/' config.ini

相关内容