2016-06-14 6 views
0

Я искал способ найти и заменить строки во всех файлах fortran в моем текущем каталоге. Большинство ответов на здесь вдоль линий с помощью:Проблема с командой sed в Bash для замены строки

sed -i 's/INCLUDE \'atm/params.inc\'/USE params/g' *.f 

или

perl -pi -w -e 's/INCLUDE \'atm/params.inc\'/USE params/g' *.f 

Однако, когда я использую один из этих Баш продолжение строки> выскакивает на следующей строке, как будто это ожидает ввода или другой аргумент. Я не видел, чтобы кто-то еще сталкивался с этим, и я не уверен, что с ним делать. Являются ли мои команды неправильными; я что-то упускаю?

+0

BashFAQ # 21, в http://mywiki.wooledge.org/BashFAQ/021, дает канонический механизм для этого. –

+1

BTW, 'sed -i' является нестандартным расширением - стандарт POSIX для' sed' не гарантирует, что он будет доступен, и даже когда он * * доступен, он может вести себя по-разному (Версия MacOS X не будет работать с вашей командой). Если вы хотите написать переносимый код, вместо этого используйте вместо него 'ex' или другой механизм, указанный в стандартном соответствии в вышеупомянутых часто задаваемых вопросах. –

+0

Можете ли вы подтвердить, что вы можете воспроизвести ошибку с ** точными командами, указанными здесь **? В частности, '' s/old-string/new-string/g'', с 'old-string' и' new-string' в качестве литерала, точный исходный и целевой текст (не какой-либо другой текст, для которого вы используете эти строки в качестве заполнителей)? –

ответ

4

Есть две проблем с оригиналом:

  • Вы не защищали ваш / в буквальных данных от разобрана sed, а не рассматриваются как данные. Один очень читаемый и явный способ сделать это - [/].
  • Вы пытались использовать \', чтобы разместить литерал ' в строке с одной кавычкой. Это не работает. Распространенный идиом '"'"', который, символ за символом, делает следующее:

    1. ' - выходит оригинальный сингл-цитируемого контекст
    2. " - открывает двойной цитируемый контекст
    3. ' - добавляет буквальные одинарные кавычки (защищено от окружающих двойных кавычек)
    4. " - заканчивается, что в двойных кавычках контекст
    5. ' - возобновляет внешний одинарные кавычки контекста.

Итак, рассмотрим:

# note: this works with GNU sed, not MacOS sed or others 
sed -i 's/INCLUDE '"'"'atm[/]params.inc'"'"'/USE params/g' *.f 
+0

Спасибо, это был неправильный вопрос, который я только что редактировал. Я так и не вводил фактические команды. Я не уверен, какой другой код вы хотели бы видеть, так как я не делаю ничего, кроме этой команды. – WhS4

+0

@ WhS4, вы получаете заданное поведение с ** точными строками ** 'old-string' и' new-string'? Если нет, вам нужно построить лучший пример. –

+0

Спасибо! Это сработало отлично. Полагаю, я должен был прочитать мой синтаксис еще немного, прежде чем погрузиться, но, тем не менее, спасибо. – WhS4

Смежные вопросы