Используйте sed для замены `,` в скобках - PullRequest
1 голос
/ 03 апреля 2019

Я хотел бы заменить запятые в скобках пробелами (а также убрать скобки). Я использовал sed, но решение, к которому я мог прийти, зависит от элементов в списке.

sed 's/\[\(.*\), \(.*\)\]/\1 \2/g'

# [-0.0, 1.23]       => -0.0 1.23   (works)
# [-0.0, 1.23, 4.56] => -0.0, 1.23 4.56 (doesn't work)
# foo=[12.3, 4.5, 3.0, 4.1], bar=123.0, xyz=6.7 => foo=12.3, 4.5, 3.0 4.1, bar=123.0, xyz=6.7` (doesn't work, expected: foo=12.3 4.5 3.0 4.1, bar=123.0, xyz=6.7)

Есть ли способ sed, чтобы сделать то, что я хочу?

1 Ответ

3 голосов
/ 03 апреля 2019

Рассмотрим этот тестовый файл:

$ cat file
[-0.0, 1.23]
[-0.0, 1.23, 4.56]
foo=[12.3, 4.5, 3.0, 4.1], bar=123.0, xyz=6.7
[1,2,-3,4]

Чтобы удалить любые запятые в квадратных скобках, а также удалить квадратные скобки:

$ sed -E ':a; s/(\[[^],]*), */\1 /; ta; s/\[([^]]*)\]/\1/g' file
-0.0 1.23
-0.0 1.23 4.56
foo=12.3 4.5 3.0 4.1, bar=123.0, xyz=6.7
1 2 -3 4

Как это работает

  • :a

    Это определяет метку a.

  • s/(\[[^],]*), */\1 /

    Это ищет первую запятую вквадратная скобка и удаляет ее.

    [^],] соответствует любому символу, кроме ] или ,.Таким образом, (\[[^],]*) соответствует [, за которым следует любое количество символов, отличное от ] или ,, и сохраняет результат в группе 1.

  • ta

    Если приведенная выше замена привела к изменению, вернитесь к метке a, чтобы мы могли повторить попытку замены.

  • s/\[([^]]*)\]/\1/g

    После того, как мы получимпосле удаления запятых удаляются квадратные скобки.

    Обратите внимание, что [^]] соответствует любому символу , а не ].Таким образом, \[([^]]*)\] соответствует [, за которым следует любое количество символов, кроме ], за которым следует ].Другими словами, оно соответствует одному выражению в скобках, и содержимое выражения, за исключением квадратных скобок, сохраняется в группе 1.

...