Как сделать команду sed, чтобы обрезать пробелы в конце строки или нормализовать пробелы в строке?

0

У меня есть некоторые данные, такие как следующие

"brand": "Some brand name  ", "otherbrand": "Something else ", 

"brand":"Some  third way"

хотя и немного более неструктурированным, но одна структура, которая является такой же, состоит в том, что есть повторяющиеся случаи «бренда»: вокруг, со следующим значением, имеющим неудобный пробел.

Что мне нужно сделать, это нормализовать пробел и обрезать его по значению так, чтобы

"brand": "Some brand name  "

превращается в

"brand": "Some brand name"

а также

"brand":"Some  third way"

превращается в

"brand":"Some third way"

размер файла

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

user254694
источник
Это специфично для ценности бренда?
glenn jackman

Ответы:

0

Это должно работать:

sed 's/ *"/"/g;s/  */ /g'

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

 $ echo "Before:"; cat $TEMP/test.txt; echo "After:";sed 's/ *"/"/g;s/  */ /g' $TEMP/test.txt
Before:
"brand": "Some brand name  ", "otherbrand": "Something else ",
"brand":"Some  third way"
After:
"brand":"Some brand name","otherbrand":"Something else",
"brand":"Some third way"
gogoud
источник
это только мой тест, или это приводит к появлению лишнего пробела после "некоторого бренда" и следующей запятой? я получаю: «бренд: какой-то бренд, другой бренд: что-то еще»
Daniel
@Daniel Я добавил пример вывода, я думаю, что все в порядке
gogoud
это выглядит правильно - мой дает дополнительное пространство. версия sed 4.2.1
Daniel
@Daniel: я использую sed (GNU sed) 4.2.2.
gogoud
0
sed ':in
s/^\(\([^"]*"[^"]*"\)*[^"]*"[^"]*\) \{2,\}/\1 /
t in
:edge
s/^\(\([^"]*"[^"]*"\)*[^"]*"[^"]*\) \{1,\}"/\1"/
s/^\(\([^"]*"[^"]*"\)*[^"]*"\) \{1,\}/\1/
t edge
' YourFile
  • Версия POSIX так --posix -e для гну сед
  • рекурсивное удаление нескольких пробелов внутри строки кавычек (не трогать между ними, можно сделать с небольшими изменениями)
  • рекурсивное удаление края края внутри строки в кавычках (один для начала и один для окончания)
NeronLeVelu
источник