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

"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, просто с помощью строки в терминал.

2 ответа2

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"
0
sed ':in
s/^\(\([^"]*"[^"]*"\)*[^"]*"[^"]*\) \{2,\}/\1 /
t in
:edge
s/^\(\([^"]*"[^"]*"\)*[^"]*"[^"]*\) \{1,\}"/\1"/
s/^\(\([^"]*"[^"]*"\)*[^"]*"\) \{1,\}/\1/
t edge
' YourFile
  • Версия POSIX, так что --posix -e для GNU SED
  • рекурсивное удаление нескольких пробелов внутри строки в кавычках (не трогать, можно сделать с небольшими изменениями)
  • рекурсивное удаление края края внутри строки в кавычках (один для начала и один для окончания)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .