изменение строки с sed, куда он пошел?

3
$ 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» тестовой папки?

    
задан grepmaster 13.05.2015 в 07:43
источник

2 ответа

4

Ваша sed invokation неверна.

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

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

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

Входной файл является последним аргументом, а не первым.

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

    
ответ дан chaos 13.05.2015 в 08:27
источник
1

Причина, по которой ваш 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) (ну, с backticks, но я не знаю, как их процитировать). Это нормально, но лучше использовать красивый while цикл, делающий while read line; do ... done < file . Таким образом, вы читаете по одной строке за раз. См. Более широкое обсуждение темы в Чтобы читать строки, а не слова, переведите / переадресовать на цикл «while read».

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

  • Нет необходимости в grep "something" , а затем проверить статус $? . Вы можете напрямую использовать grep -q для этого.

  • Некоторые из этих предложений можно найти, вставив ваш скрипт в Ссылка .

ответ дан fedorqui 13.05.2015 в 11:16