Как разделить файл на основе контекста?

Проблема в том, что аргумент - command lxterminal - это всего лишь одна строка, она не может принимать команду и ее аргументы, как некоторые другие терминалы, например ] xterm делать.

lxterminal анализирует эту строку, используя свои собственные правила, чтобы определить команду для запуска и ее аргументы. Это похоже, но не идентично синтаксическому анализу оболочки Борна.

Он распознает '...' как строгие кавычки и пробел в качестве разделителя аргументов, поэтому вы можете реализовать кавычки для него как:

lxquote() {
  awk -v q="'" '
    function lxquote(s) {
      gsub(q, q "\\" q q, s)
      return q s q
    }
    BEGIN {
      for (i = 1; i < ARGC; i++) {
        printf sep "%s", lxquote(ARGV[i])
        sep = " "
      }
    }' "$@"
}

И вызвать lxterminal как:

lxterminal --command="$(lxquote ./script2 "$@")"

В качестве альтернативы, если интерпретатором скрипта является bash , вы можете сделать:

printf -v code '%q ' ./script2 "$@"
CODE=$code lxterminal --command="bash -c 'eval \"\$CODE\"'"
1
24.08.2017, 18:44
2 ответа

awkрешение:

awk '/^===/{ fn=substr($NF,2,length($NF)-3) }{ print > fn }' file

Каждому файлу будет присвоено имя в соответствии с именем хоста(SERVERNAME<number>)

  • /^===/-на линии пересечения, начинающейся с===

  • fn=substr($NF,2,length($NF)-3)-создание имени файла fn,substr($NF,2,length($NF)-3)-будет извлекать имя хоста, игнорируя круглые скобки вокруг него($NF-последнее поле)

  • print > fn-вывести базовую строку в файл
3
27.01.2020, 23:24

Не превышайте -регулярное выражение:

$ csplit logfile '/^===/'

Это создает xx00для первого раздела и xx01для второго.

В качестве альтернативы, если у вас есть другие строки, начинающиеся с ===, которые вы не хотите разбивать на:

$ csplit logfile '/^=== Output from/'

Чтобы заменить xxдругой фиксированной строкой, используйте-p(строка не может быть взята из входных данных, к сожалению ).

1
27.01.2020, 23:24

Теги

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