Замена команды - одинарные кавычки и пробелы

Если Вы хотите выполнить команду на первой строке входного текста, необходимо использовать NR==1 шаблон, нет BEGIN.

awk  -F'=' '
    NR==1 {
            MIN=$2; MAX=$2; print MIN;
    }
    NR>1 {
            if ( $2 > MAX )
            {
                    MAX = $2;
            }
...

Как указано @jw013, BEGIN шаблон - чтобы действия выполнились перед чтением первой строки.

2
17.04.2013, 14:02
5 ответов

Вы видите точно, при помощи чего выполняется команда set -x. Довольно глупый пример:

$ echo $(echo "foo 'bar baz' taz\\ jaz")
foo 'bar baz' taz\ jaz

даст:

++ echo 'foo '\''bar baz'\'' taz\ jaz'
+ echo foo ''\''bar' 'baz'\''' 'taz\' jaz
foo 'bar baz' taz\ jaz

Это несколько трудно считать из-за всего выхода. Например, то второе слово:

  1. '' ничем не становится.
  2. \' становится одинарной кавычкой (')
  3. 'bar' становится bar

так, чтобы параметр был передан как 'bar. Можно подтвердить с чем-то вроде этого (предположение, что у Вас есть Данные:: Дамп установил, который не является значением по умолчанию, к сожалению), Примечание $(echo… был скопирован дословно в строку жемчуга:

$ perl -MData::Dump=pp -E 'pp @ARGV' $(echo "foo 'bar baz' taz\\ jaz")
("foo", "'bar", "baz'", "taz\\", "jaz")

Что происходит, вот то, что удар делает разделение слова (базирующийся прочь $IFS), не парсинг аргумента. Таким образом, к сожалению, вероятно, необходимо использовать eval, и соглашение со всем риском, который влечет за собой.

$ eval "echo $(echo "foo 'bar baz' taz\\ jaz")"
foo bar baz taz jaz

(Кроме того, я отмечу, если можно заставить команду генерировать свой вывод как список имен, разделенных NUL, который был бы легок иметь дело с использованием xargs -0 и далее, полностью безопасный).

2
27.01.2020, 22:06

Вы находитесь в редком положении, чтобы иметь список файлов, который находится в формате это xargs понимает. Таким образом выполненный

command1 | xargs command2

Обратите внимание на это на некоторых вариантах Unix, если вывод command1 огромно, будет невозможно работать command2 со всеми именами файлов из-за предела длины командной строки. Оборотная сторона использования xargs это, это будет несколько раз выполнять команду вместо того, чтобы правильно сообщить об ошибке. Можно проверить предел длины командной строки с getconf ARG_MAX.

1
27.01.2020, 22:06

Попробуйте что-то вроде этого:-

path1="/etc/passwd"
path2="/var/log/secure"

[root@localhost base_filters]# ls -l "$path1" "$path2"
-rw-r--r--. 1 root root 1876 Mar 10 22:15 /etc/passwd
-rw-------. 1 root root 2408 Apr  5 23:09 /var/log/secure
0
27.01.2020, 22:06

Не знайте, понимаю ли я полностью Ваш вопрос, но maby, это поможет:

$ var=$(echo "'/path/to/dir 1' '/path/to/dir 2' '/path/to/dir 3'")
$ echo -n $var | sed "s/^'\(.*\)'\$/\1/g" | sed "s/' '/\x00/g" | xargs -0 command1
0
27.01.2020, 22:06

Попытайтесь играть вокруг с переменной IFS, так, чтобы пространство не влияло на Ваш сценарий. Я сохранил бы IFS в переменной и после завершающихся действий моего сценария, я восстановлю IFS.

0
27.01.2020, 22:06

Теги

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