我正在尝试替换文件中的字符串:
$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