меняя строку с помощью sed, куда она делась?

$ cat test-paths.txt 
test/sub2/configuration.php
test/sub3/configuration.php
test/configuration.php
test/sub1/configuration.php

$ cat find-host-test 
#!/bin/bash
for i in `cat test-paths.txt`
 do 
  echo $i
  grep "public \$host = '127.0.0.1';" $i
  #echo $?
  if [ $? -eq 0 ]
   then
    echo "there's config file"
    sed $i 's/$host = 127.0.0.1/$host = localhost/' 
    echo "changed to"
    grep "public \$host =" $i
  fi
 done

выполнение find-host-test привело к

$ bash find-host-test 
test/sub2/configuration.php
    public $host = '127.0.0.1';
there's config file
sed: can't find label for jump to `est/sub2/configuration.php'
changed to
    public $host = '127.0.0.1';
test/sub3/configuration.php
test/configuration.php
    public $host = '127.0.0.1';
there's config file
sed: can't find label for jump to `est/configuration.php'
changed to
    public $host = '127.0.0.1';
test/sub1/configuration.php
    public $host = '127.0.0.1';
there's config file
sed: can't find label for jump to `est/sub1/configuration.php'
changed to
    public $host = '127.0.0.1';

Почему исчезла буква «t» тестовой папки?

3
задан 13 May 2015 в 10:21

2 ответа

Ваш sed вызов является неправильным.

sed 's/$host = 127.0.0.1/$host = localhost/' "$i"

См. страницу руководства sed:

sed [OPTION]... {script-only-if-no-other-script} [input-file]

inputfile является последним аргументом, не hte сначала.

заметка на полях Interessting : t в sed назван маркировкой. После t название маркировки следует. В Вашем случае это - входное имя файла без продвижения t. sed поэтому попытки перейти к маркировке, названной est/sub2/configuration.php, который sed не может найти нигде. Второе выражение s///g никогда не выполняется.

0
ответ дан 13 May 2015 в 20:21
  • 1
    Это - то, в чем я нуждался, когда я загрузил установщик с VirtualBox' s веб-сайт, Спасибо! – Osmar 11 January 2019 в 12:01

Причина, почему Ваш sed не работает был уже дан хорошим ответом хаоса.

Позвольте мне пойти немного шага вперед для указания на другой способ циклично выполниться через файл, так как Вы используете некоторые ненужные шаги:

while IFS= read -r file
do
    echo "$file"
    if grep -q "public \$host = '127.0.0.1';" "$file"; then
        echo "there's config file"
        sed 's/$host = 127.0.0.1/$host = localhost/' "$file"
        echo "changed to"
        grep "public \$host =" "$file"
    fi
done < "test-paths.txt"

Различия:

  • Вы используете for i in $(cat test-paths.txt) (хорошо, с обратными галочками, но я не знаю, как заключить им в кавычки). Это в порядке, но лучше использовать красивое while выполнение цикла while read line; do ... done < file. Таким образом, Вы читаете одну строку за один раз. Посмотрите более широкую дискуссию о теме в считать строки, а не слова, канал/перенаправление к, 'в то время как считано' цикл.

  • Кроме того, использование обратных галочек удерживается от использования. Лучше использовать $(), так как возможно вложить их. (На самом деле мы уже заметили, что это даже плохо при регистрации ответа здесь :))

  • Нет никакой потребности к grep "something" и затем проверьте $? состояние. Можно непосредственно использовать grep -q для этого.

  • Некоторые из этих предложений могут быть также найдены путем вставки сценария в http://www.shellcheck.net/.

1
ответ дан 13 May 2015 в 20:21
  • 1
    Довольный Вы получили его движение! С наилучшими пожеланиями, Al – heynnema 13 August 2016 в 12:39

Другие вопросы по тегам:

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