2016-04-26 2 views
2

У меня есть FILE1.TXT с ниже содержание:Использование двойных кавычек в двойные кавычки

time="2016-04-25T17:43:11Z" level=info msg="SHA1 Fingerprint=9F:AD:D4:FD:22:24:20:A2:1E:0C:7F:D0:19:C5:80:42:66:56:AC:6F" 

Я хочу, чтобы файл выглядеть, как показано ниже:

9F:AD:D4:FD:22:24:20:A2:1E:0C:7F:D0:19:C5:80:42:66:56:AC:6F 

На самом деле, мне нужно пройти как строку. Вот почему команда bash должна быть инкапсулирована в строку с двойными кавычками. Однако, когда я включаю

" grep -Po '(?<=Fingerprint=)[^"]*' " 

Я не получаю желаемый результат. Кажется, что мне нужно избежать двойных кавычек правильно.

+0

Это, возможно, дублирующее http://stackoverflow.com/questions/2005192/how-to-execute-a-bash-command-stored-as-a-string-with-quotes-and-asterisk –

+0

.. .btw, bash и POSIX sh отличаются некоторыми довольно уместными способами (оболочка Bourne отличается еще больше, но не присутствует на том, что когда-либо отправляла Red Hat, поэтому ваша маркировка исключает ее). Я включил в свой ответ только раздел, основанный на bash, но если бы вы только отметили один из двух, было бы понятнее, приемлемо ли это. –

ответ

5

Чтобы ответить на вопрос literal, вы можете использовать обратную косую черту, чтобы избежать буквенных двойных кавычек в вашей команде. Однако, по причинам, указанным в BashFAQ #50, это чрезвычайно плохая практика:

# Avoid this absent a very good reason 
grep_cmd_str="grep -Po '(?<=Fingerprint=)[^\"]*'" 
eval "$grep_cmd_str" <file1.txt # eval is necessary, with all the issues that implies 

Лучше практика, когда вам нужно хранить простую команду (без перенаправлений или другие конструкции оболочки) [1] в переменная должна использовать массив [2], а не скалярную переменную, чтобы держать свои аргументы:

# Use this principally if you need to dynamically build up an argument list 
grep_args=(grep -Po '(?<=Fingerprint=)[^"]*') 
"${grep_args[@]}" <file1.txt 

Если у вас нет каких-либо constra Интс, которые требуют, чтобы использовать любой из указанных выше, рассмотрим функцию (которая действительно позволяет переназначения и оболочки строит так долго, как они зашиты):

# Use this whenever possible, in preference to the above 
grep_fp() { grep -Po '(?<=Fingerprint=)[^"]*' "[email protected]"; } 
grep_fp <file1.txt 

[1] - Не оценки оболочки В этом контексте конструкцией является функция безопасности: она защищает вас от вредоносных имен файлов или аналогичного содержимого в значениях, которые были заменены на значение, которое вы используете в качестве команды.

[2] - Обратите внимание, что массивы недоступны в POSIX sh, на которые также указан ваш вопрос. Тем не менее, подобная функциональность доступна путем переопределения "[email protected]" (предположительно в ограниченной области, такой как функция, так что ее исходное значение сохраняется).

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