Я хочу использовать sed для замены каждого вхождения / dir на $ dir (replace / with $) в каждом сценарии в каталоге - PullRequest
0 голосов
/ 01 марта 2010

используйте sed для замены каждого вхождения / dir на $ dir (replace / with $) в каждом сценарии в каталоге.

sed "s # / dir # $ dir # g"

$ продолжает интерпретироваться как вызов функции или переменной. Есть ли способ обойти это?

спасибо

Ответы [ 3 ]

1 голос
/ 01 марта 2010

Прочитайте дружественное руководство вашей оболочки:

man sh

В оболочке «двойные кавычки» вокруг текста допускают интерпретацию переменных внутри, в то время как «одинарные кавычки» - нет, соглашение, принятое более поздними языками, такими как Perl и PHP (но не, например, JavaScript).

sed 's#/dir#$dir#g' *

Чтобы выполнить замену в скриптах, сделайте что-то вроде

find * -maxdepth 0 -type f | while read f; do  mv $f $f.old && sed 's#/dir#$dir#' $f.old > $f; done

или просто

perl -pi.old -e 's#/dir#\$dir#' *  # Perl also interpolates variables in s commands
0 голосов
/ 02 марта 2010

подход к оболочке

for file in file*
do
  if [ -f "$file ];then
      while read -r line
        case "$line" in 
          */dir* ) line=${line///dir/\$dir}
        esac
        echo $line > temp    
      done < "file"
      mv temp $file
  fi
done
0 голосов
/ 01 марта 2010

Вы можете просто избежать его с обратной косой чертой:

sed "s#/dir#\$dir#g"
...