Недостающее место при использовании sed - PullRequest
3 голосов
/ 27 февраля 2020

Поэтому я использую lsof в сочетании с jq для преобразования в json. Исходный пример вывода:

  [
    "blah",
    "1234",
    "yoda",
    "561u",
    "IPv4",
    "297229000",
    "0t0",
    "TCP",
    "15.60.74.17:1511",
    "(LISTEN)"
  ]
]

При использовании с sed как:

sed -e "s/(//" -e "s/)//" | sed 's/.*:\([0-9]\+\).*/"\1",/g'

Вывод выглядит как:

  [
    "blah",
    "1234",
    "yoda",
    "561u",
    "IPv4",
    "297229000",
    "0t0",
    "TCP",
"1511",
    "LISTEN"
  ]
]

Обратите внимание, что пробел не сохранил для "1511" не уверен, что мне не хватает, я уверен, что-то глупо, кто-нибудь знает, что я здесь скучаю?

Ответы [ 3 ]

0 голосов
/ 28 февраля 2020

Вы можете использовать регистр, но проще сопоставить меньше:

echo '    "15.60.74.17:1511",' | sed -e "s/(//" -e "s/)//" -e 's/[0-9\.]*:\([0-9]\+\).*/\1",/g'

Кстати, вам не нужно 2 sed - только один с двумя -e.

0 голосов
/ 28 февраля 2020

Не могли бы вы попробовать следующее:

sed -e 's/(\([^)]*\))/\1/' -e 's/[[:digit:].]*:\([[:digit:]]\+\)/\1/'
  • 1-е регулярное выражение (\([^)]*\)) соответствует подстроке, окруженной паренами, и подстрока записывается в \1.
  • Второе регулярное выражение [[:digit:].]*:\([[:digit:]]\+\) соответствует подстроке, состоящей из чисел и / или точек, за которой следует двоеточие :, а затем другая последовательность чисел. Начальная часть чисел, точек и двоеточия удаляется.
0 голосов
/ 27 февраля 2020

Это из-за первого .* в вашей второй команде sed. Вы можете сохранить пробелы с помощью чего-то вроде этого:

sed -e "s/(//" -e "s/)//" | sed 's/\S*:\([0-9]\+\).*/"\1",/g'

То, что я сделал, это ... Я могу объяснить, но было бы веселее, если вы сами разберетесь;)

Править : Хорошо, я говорю это: регулярное выражение второго sed совпадает с первым непробельным символом (\S означает не пробел, это противоположно \s). Итак, ваш второй sed не соответствует пробелам перед значениями.

Если бы я был на вашем месте, я бы не использовал sed для этой задачи. Отмена ввода JSON с помощью инструмента, подобного Python, и работа со значениями таким способом будет более надежным методом. Тем не менее, если бы мне пришлось делать это с помощью sed, я бы переписал второй sed следующим образом:

sed -e "s/(//" -e "s/)//" | sed 's/".*:\([0-9]\+\)",$/"\1",/g'
...