Sed反转两个字


8
echo "AXIS2C_HOME=/usr/local/Axis2C" | sed 's/\(^AXIS2C_HOME=\) \(.*\)/ \2 \1/'

我期望的输出是/usr/local/Axis2C AXIS2C_HOME=

我不知道自己在做什么错。:(

Answers:


8

简单的答案是“更多的反斜杠,更少的空格”:

echo "AXIS2C_HOME=/usr/local/Axis2C" | sed 's/\(^AXIS2C_HOME=\)\(.*\)/\2 \1/'

但更广泛的答案是:“等等,您要做什么?” 您是否希望将键值对拆分为有用的变量,或者您真的只是想将输入改成相反的语法,以便将其提供给其他对象?


1

。之后您有一个错误的空间=。尝试:

sed 's/\(^AXIS2C_HOME=\)\(.*\)/\2 \1/'

以下内容也适用,但略短一些。\1在第一个之前会是什么/

sed 's|^\([^/]*\)\(/.*\)|\2 \1|'

0

Sed很棒,但是Perl也可以做到这一点,并且不需要反斜杠目录林:

% echo "AXIS2C_HOME=/usr/local/Axis2C" | perl -pe 's/(^AXIS2C_HOME=)(.*)/\2 \1/'
/usr/local/Axis2C AXIS2C_HOME=

另外,您拥有正则表达式引擎的全部功能,因此您可以执行更复杂的模式。


2
如果您拥有sed支持扩展的正则表达式的GNU sed之类的代码,那么您也可以避免反斜杠之林:echo "AXIS2C_HOME=/usr/local/Axis2C" | sed -r 's/(^AXIS2C_HOME=)(.*)/\2 \1/'
Steven D

@Steven D:森林是我的朋友……(熊双关语的原意是……另一半是:我想如果没有他们,我会迷路的:)……但是我正在考虑,既然你已经提到了-r ...(我已经考虑过了。我会坚持使用反斜杠,否则我将失去理解其他人的sed陈述的能力:)
Peter.O 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.