Bash 使用sed进行分组和替换

Bash 使用sed进行分组和替换,bash,awk,sed,Bash,Awk,Sed,我有一个文件,其中有些行是这样的: ENV FOO bar ENV BAZ boz ENV BIP bop 我只想将这些行转换为: export FOO=bar export BAX=boz export BIP=bop 我有bash供我使用,并试图通过sed、awk等实现它,但现在是周五下午,我还没有完全做到 有什么建议吗?最接近我的是: sed -i 's/^ENV\s\([A-Z]\)\s*\([A-Z]\)/export \1 = \2/g' -i file 谢谢。使用awk: a

我有一个文件,其中有些行是这样的:

ENV FOO bar
ENV BAZ boz
ENV BIP bop
我只想将这些行转换为:

export FOO=bar
export BAX=boz
export BIP=bop
我有bash供我使用,并试图通过
sed
awk
等实现它,但现在是周五下午,我还没有完全做到

有什么建议吗?最接近我的是:

sed -i 's/^ENV\s\([A-Z]\)\s*\([A-Z]\)/export \1 = \2/g' -i file
谢谢。

使用awk:

awk '$1=="ENV"{printf "export %s=%s%s", $2, $3, ORS}' file
export FOO=bar
export BAZ=boz
export BIP=bop
说明:

$1=="ENV"                             # Do it only when first field is ENV
printf "export %s=%s%s", $2, $3, ORS  # print formatted output by inserting =
                                      # between field 2 and field 3
使用sed:

sed '/^ENV /s/^ENV/export/;s/ \+\([^ ]\+$\)/=\1/' file
export FOO=bar
export BAZ=boz
export BIP=bop
使用awk:

awk '$1=="ENV"{printf "export %s=%s%s", $2, $3, ORS}' file
export FOO=bar
export BAZ=boz
export BIP=bop
说明:

$1=="ENV"                             # Do it only when first field is ENV
printf "export %s=%s%s", $2, $3, ORS  # print formatted output by inserting =
                                      # between field 2 and field 3
使用sed:

sed '/^ENV /s/^ENV/export/;s/ \+\([^ ]\+$\)/=\1/' file
export FOO=bar
export BAZ=boz
export BIP=bop
您需要在这两个范围内使用中继器(
*
),在后一个范围内使用小写。正如@EmilKakkau所提到的,您需要
-r
选项,而不需要括号中的转义符

sed -r 's/^ENV\s([A-Z]*)\s*([a-z]*)/export \1 = \2/g' -i file
您需要在这两个范围内使用中继器(
*
),在后一个范围内使用小写。正如@EmilKakkau所提到的,您需要
-r
选项,而不需要括号中的转义符

sed -r 's/^ENV\s([A-Z]*)\s*([a-z]*)/export \1 = \2/g' -i file
2替代,考虑任何值


2替换,考虑任何值

在处理替换变量
\1
\2
时,需要使用reg exp标志
-r
,并移除匹配前后的转义符,如
([A-Z])
@geert3运行w/o
-r
@EmilKakkau时,我在使用内部替换变量时遇到了一些问题
\n
@EmilKakkau很抱歉,您在-r上是对的。对我来说也是星期五;-)处理替换变量
\1
\2
时,需要使用reg exp标志
-r
,并在匹配前后移除转义符,如
([A-Z])
@geert3运行w/o
-r
@EmilKakkau时,我在使用内部替换变量时遇到了一些问题
\n
@EmilKakkau很抱歉,您在-r上是对的。对我来说也是星期五;-)谢谢@anubhava。唯一的问题是,它还将这样的行:WORKDIR/home/dev转换为WORKDIR=/home/dev您确定吗?我有
$1==“ENV”
条件确保第一个字段是
ENV
谢谢@anubhava。唯一的问题是,它还将这样的行:WORKDIR/home/dev转换为WORKDIR=/home/dev您确定吗?我有
$1==“ENV”
条件,确保第一个字段是
ENV
你怎么能在
=
之前和之后有一个空格,而这个空格不在sed的最终结果中?我建议对变量内容使用
(.*)
而不是
([a-z])
,在
=
之前和之后,您怎么能有一个空间不在sed的最终结果中?我建议对变量内容使用
(.*)
而不是
([a-z])