Нужна AWK / SED для замены значений, присутствующих внутри $ {}

Попробуйте загрузиться с CD или DVD Parted Magic или gparted и выберите опцию загрузки в память. Если при этом загрузится графическая ОС, то память, вероятно, в порядке. Запустите G-parted и проверьте разделы на наличие повреждений и попытайтесь их восстановить. У вас может быть файл операционной системы, который не прошел проверку crc, или несоответствие диска, возможно, плохой жесткий диск, или, возможно, корневой набор, который нужно удалить. Используя живой диск или parted magic disk, вы можете исключить проблемы с памятью или чипсетом, так как загрузка будет неудачной.

-1
27.10.2018, 18:12
5 ответов

Вы можете сделать что-то вроде:

perl -pe 's/^[\w.]+(?==)|\$\{[\w.]+\}/$& =~ y|.|_|r/ge' < file

То есть заменить .на _в последовательностях словесных символов или ., которые находятся в начале строки, за которыми следует =или внутри ${...}.

Флаг rдля оператора y///(, чтобы результат подстановки возвращался вместо применения к переменной ), требует perl 5.14 или выше. В более старых версиях вы всегда можете сделать:

perl -pe 's/^[\w.]+(?==)|\$\{[\w.]+\}/$_ = $&; y|.|_|; $_/ge' < file

Теперь, для вашей конечной задачи, так же легко сделать все это в perlздесь, а не интерпретировать код в оболочке, что было бы довольно опасно:

 perl -lne '
    s/\$\{([\w.]+)\}/$v{$1}/g;
    if (/^([\w.]+)=(.*)/) {
      $v{$1} = $v = $2;
      print $v if $1 =~ /_url$/
    }' < file > separate-file
3
28.01.2020, 05:08

Попробуйте это,

sed -e 's/\./_/g' -e '/com/ s/_/\./3g' test789
a_host_name=wanx.com
b_host_name=xyu.com
c_host_name=${b_host_name}
d_host_name=${c_host_name}

url1=https://${d_host_name}/test
url2=https://${a_host_name}/test2
  • первый sed заменит все .на_
  • второй sed заменит 3-й _на ., если в строке естьcom
0
28.01.2020, 05:08

Если то, что вы называете "выводом этого файла", является вашим окончательным желаемым результатом, попробуйте

    awk -F= '
                    {gsub (/[${}]/, "")
                    }
    !/^url/         {T[$1]=($2 in T)?T[$2]:$2
                     next
                    }
                    {sub (/^url[^=]*=/, "")
                     for (t in T)   if ($0 ~ t) sub (t, T[t])
                    }
    1
    ' file
https://xyu.com/test
https://wanx.com/test2
0
28.01.2020, 05:08

Вы можете попробовать так:

cat get_env_properties.sh 
sed -i'.bak' '
  :A
    s/\(.*\)\(\.\)\([^=]*=.*\)/\1_\3/
    tA
  :B
    s/\([^{]*{.*\)\(\.\)\([^}]*}.*\)/\1_\3/
    tB
' "$1"

. "$1"

echo "url1 = $url1"
echo "url2 = $url2"

mv "$1.bak" "$1"

Ты называешь это так

./get_env_properties.sh env.properties

Ваш sed должен быть в порядке с -i

1
28.01.2020, 05:08

Решение awk:

awk -F= -vOFS='=' '{                         gsub(/\./,"_",$1);
                        if($2~/\$\{[^}]*\}/){gsub(/\./,"_",$2)}
                   } 1' endpoint_test.txt

Он заменит все точки на _в первом поле и то же самое в поле $2, которые имеют ${…}.

0
28.01.2020, 05:08

Теги

Похожие вопросы