Извините, но я соглашусь с @choroba и посоветую вам использовать инструмент, способный парсить и писать yaml. Разбор Sed - неправильный путь. у вас может быть другой отступ, несколько непрерывных концовок. Регулярное выражение стало бы слишком сложным, и вам пришлось бы писать свой собственный синтаксический анализатор Yaml.
Вот решение на рубине Что вы можете использовать в оболочке Bash
echo "ssl:
enabled: false
" | bundle exec ruby -e "require 'psych';
c = Psych.load(STDIN.read); c['ssl']['enabled'] = true;
puts c.to_yaml" > updated_dest.yml
если вам нужен сценарий оболочки, который принимает два параметра, это также легко
#!/usr/bin/env ruby
require 'psych'
c = Psych.load_file(ARGV.shift)
c['ssl']['enabled'] = true
File.open(ARGV.shift, 'wb+') {|f| f.write(c.to_yaml)}
Во-первых, в команде поиска отсутствует знак $
. И чтобы получить только самую глубокую директорию, которую вы можете использовать, найдите вот так:
restOfPath=$(find $rootPath/$1 -type d -links 2)
Вы также можете попробовать этот способ (, что немного странно, но сработает):
restOfPath=$(find $rootPath/$1 -type d |awk '{lnew=gsub(/\//,"/",$0); if (lnew > l) {l=lnew p=$0}; } END {print p}')
Результат применения к вашему сценарию исправлений, предложенных shellcheck.net .
rootPath="/share/data/"
anchorDir="${1}"
restOfPath=$(find /rootPath/"$1"/ -type d)
#fullPath=rootPath+anchorDir+restOfPath
echo "rest of path is $restOfPath"
Перед применением изменений были обнаружены следующие проблемы
Line 3:
rootPath="/share/data/"
^-- SC2034: rootPath appears unused. Verify use (or export if used externally).
Line 4:
anchorDir="${1}"
^-- SC2034: anchorDir appears unused. Verify use (or export if used externally).
Line 5:
restOfPath=$(find /rootPath/$1/ -type d)
^-- SC2034: restOfPath appears unused. Verify use (or export if used externally).
^-- SC2086: Double quote to prevent globbing and word splitting.
Did you mean: (apply this, apply all SC2086)
restOfPath=$(find /rootPath/"$1"/ -type d)
Line 7:
echo "rest of path is $restofPath"
^-- SC2154: restofPath is referenced but not assigned (did you mean 'restOfPath'?).
Попробуйте это,
find /rootPath/$1/ -type d -printf '/%P\n'
/
/client
/client/region
/client/region/logs
/client/region/logs/2019
если нам нужна только последняя строка,
find /rootPath/$1/ -type d -printf '/%P\n' | tail -n1
/client/region/logs/2019
%P File's name with the name of the starting-point under which it was found removed.