shell脚本替换问题

时间:2016-05-30 16:32:13

标签: bash shell sed

我有一个名为DOMAIN_PRODUCTION = "https://example.com"; DOMAIN_A = "https://example-A.com"; DOMAIN_B = "https://example-B.com"; DOMAIN_LOCAL = "http://127.0.0.1:3000"; DOMAIN = DOMAIN_A 的文本文件,其内容如下: -

文件内容:

sed

我想根据某些条件用1命令替换某些东西。当我在if语句中仅使用1行时,我能够成功地执行此操作但是当我使用超过else行时,它只执行env=LOCAL ip=http://127.1.1.2:3000 if [ $env == LOCAL ] then sed 's~DOMAIN_LOCAL = .*$~DOMAIN_LOCAL = "'"$ip"'";~' a.txt sed 's~DOMAIN = .*$~DOMAIN = '"$env"'~' a.txt # If I comment the above line, my if loop executes, but If I don't, it doesn't execute if statement, though the condition is correct. else sed 's~DOMAIN = .*$~DOMAIN = '"$env"'~' a.txt fi 语句是的。

我的脚本如下所示: -

DOMAIN_PRODUCTION = "https://example.com";
DOMAIN_A = "https://example-A.com";
DOMAIN_B = "https://example-B.com";
DOMAIN_LOCAL = "http://127.1.1.2:3000"; # Changed here
DOMAIN = DOMAIN_LOCAL # Changed here

输出应该是这样的: -

DOMAIN_LOCAL

理想情况下,它应该替换DOMAINif的值,但是当我在long.name循环中使用两个语句时,它不会执行。

我做错了什么?

4 个答案:

答案 0 :(得分:0)

将2 sed命令合并为一个

   sed 's~DOMAIN_LOCAL = .*$~DOMAIN_LOCAL = "'"$ip"'";~; s~DOMAIN = .*$~DOMAIN = '"$env"'~' a.txt

答案 1 :(得分:0)

命令

   sed 's~DOMAIN_LOCAL = .*$~DOMAIN_LOCAL = "'"$ip"'";~' a.txt

写入stdout。 完成后,您将重新开始使用原始的,未更改的a.txt。 第二个语句的输出与else子句中的命令相同:

   sed 's~DOMAIN = .*$~DOMAIN = '"$env"'~' a.txt

您可以使用以下任何方法组合两个sed语句:

   sed 'sed1' a.txt | sed 'sed2'
   sed -e 'sed1' -e 'sed2' a.txt
   sed 'sed1;sed2' a.txt

答案 2 :(得分:0)

您的命令似乎可以找到。 <field name="url" widget="url"/> 命令的问题在于它们只是sed。您需要替换文件中的更改。

echo

这将在“a.txt”中进行必要的更改。

答案 3 :(得分:0)

我认为awk更适合这个:

% cat gen.awk
ip && $1 == "DOMAIN_LOCAL" {$3 = '"' ip '"'}
dm && $1 == "DOMAIN" {$3 = dm}
1

所有在一起:

env=LOCAL
ip=http://127.1.1.2:3000

if [ "$env" = LOCAL ]; then
   awk -v ip="$ip" -v dm="$env" -f gen.awk a.txt
else
   awk -v dm="$env" -f gen.awk a.txt
fi

然而,这不会进行现场编辑。但您可以重定向if语句并使用mv

if ...; then
    ...
fi > a.txt.out
mv a.txt.out a.txt

当我们运行awk时,我们将变量设置为gen.awk脚本:

awk -v variable1=value1

在脚本中,我们用该变量替换第三列,如果它已设置并且该行中的第一列匹配:

ip && $1 == "DOMAIN_LOCAL" { $3 = '"' ip '"' }

故障:

ip                   # If ip is set and not blank
&&                   # ... and ...
$1 == "DOMAIN_LOCAL" # If first column equal DOMAIN_LOCAL
{ $3 = '"' ip '"' }  # Set third column to be "ip" (the variable, with quotes around)

1简单打印每一行。