Sed для видалення порожніх пробілів


28

Хтось знає, як використовувати Sed для видалення всіх порожніх пробілів у текстовому файлі? Я не намагався використовувати для цього команду "d" delete, але, здається, не можу це зрозуміти

Відповіді:


35

Який «космос»?

"Видалити всі порожні пробіли" може означати одну з різних речей:

  1. видалити всі виникнення символу пробілу, коду 0x20.
  2. видалити весь горизонтальний пробіл, включаючи символ горизонтальної вкладки, " \t"
  3. видаліть увесь пробіл, включаючи новий рядок, " \n" та інші

Правильний інструмент для роботи

Якщо sedце не вимога з якоїсь прихованої причини, краще скористайтеся правильним інструментом для роботи.

Команда trмає головне використання при перекладі (звідси назва "tr") списку символів до списку інших символів. Як кутовий випадок, він може перекласти у порожній список символів; Параметр -d( --delete) видалить символи, які відображаються у списку.

У списку символів можна використовувати класи символів у [:...:]синтаксисі.

  1. tr -d ' ' < input.txt > no-spaces.txt
  2. tr -d '[:blank:]' < input.txt > no-spaces.txt
  3. tr -d '[:space:]' < input.txt > no-spaces.txt

При наполяганні на sed

З sed [:...:]синтаксис для класів символів потрібно поєднувати з синтаксисом наборів символів у регулярних виразах [...], що призводить до дещо заплутаності [[:...:]]:

  1. sed 's/ //g' input.txt > no-spaces.txt
  2. sed 's/[[:blank:]]//g' input.txt > no-spaces.txt
  3. sed 's/[[:space:]]//g' input.txt > no-spaces.txt

1
+1, позначення POSIX для порожнього простору - це відповідний шлях.
Авінаш Радж

1
Чудовий натяк на використання tr для цього завдання, чудово працює. Єдине, що мені довелося скорегувати, це те, що tr читає вхід зі stdin, тому те, що працювало для мене, було tr -d ' ' < input.txt > no-spaces.txt.
Небо

@ Коментар Sky працює в моєму macOS (не перевіряється в Linux). Можливо, відповідь слід оновити?
iplus26

Дякую чимало @Sky, це справді погана помилка. Я зараз виправлю три лінії tr. (Чи бачите ви його деінде?)
Волкер Зігель

7

Ви можете використовувати це для видалення всіх пробілів у file:

 sed -i "s/ //g" file

2
Без кісток. Я також спробував подібний підхід. Не працює
Джастін

Ви хочете видалити пробіли чи вкладки?
Сайрус

1
видалити пробіли
Джастін

2
Простий тест:man sed | sed "s/ //g"
Сайрус

1
@starscream_disco_party: це те саме. Ви можете замінити всі 3 /різними символами, наприклад:sed "ss ssg"
Сайрус
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.