Як видалити всі пробіли з даного текстового файлу


81

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

Я хочу щось подібне нижче:

$ cat hello.txt | sed ....

Я спробував це: cat hello.txt | sed 's/ //g'.Але воно видаляє лише пробіли, а не вкладки.


3
під "всі пробіли", ви маєте на увазі також нові рядки?
glenn jackman

Відповіді:


133
$ man tr
NAME
    tr - translate or delete characters

SYNOPSIS
    tr [OPTION]... SET1 [SET2]

DESCRIPTION
   Translate, squeeze, and/or delete characters from standard 
   input, writing to standard output.

Щоб стерти всі пробіли, включаючи нові рядки, ви можете спробувати:

cat file.txt | tr -d " \t\n\r" 

Ви також можете використовувати класи символів, визначені tr (кредити для коментаря htompkins ):

cat file.txt | tr -d "[:space:]"

Наприклад, щоб стерти лише горизонтальний пробіл:

cat file.txt | tr -d "[:blank:]"

23
Ви також можете використовувати класи символів, визначені tr. Приклади: Видалення всього пробілу: cat file.txt | tr -d "[:space:]" Видалення всього горизонтального пробілу:cat file.txt | tr -d "[:blank:]"
htompkins

@ user3901666 він видалить пробіли, так, якщо отриманий результат буде відповідати бажаному, важко сказати - що ви пробували?
Пауло Скардін,

24

Набагато простіше, на мій погляд:

sed -r 's/\s+//g' filename

2
Я щойно спробував це, і він виводить змінений текст у STDOUT, але сам файл не змінює.
Макс Вільямс

4
@MaxWilliams - просто використовуй прапор -i (тире i) з sed
JeffCharter

1
Це не видаляє нові рядки, не впевнений, чи бажав це OP.
Graeme Moss

11

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

cat hello.txt | sed '/^$/d;s/[[:blank:]]//g'

4
Чудово, але я не думаю, що зможу змусити себе писатиtr -d " " < infile.txt > outfile.txt
NReilingh

Привіт, це працює завдяки, але я був би вдячний за деякі пояснення.
Девід Оквії

11

Спробуйте це:

sed -e 's/[\t ]//g;/^$/d' 

(знайдено тут )

Перша частина видаляє всі вкладки ( \t) та пробіли, а друга частина видаляє всі порожні рядки


1
Це насправді працює. Обережно поясніть sed -e 's / [\ t] // g; / ^ $ / d' особливо / ^ $ / d '. Я знаю ^ для початку рядка, $ для кінця. / d для видалення при використанні sed. Але як таке тлумачення призводить до видалення пробілів?
Девід Оквії

Я додав пояснення. ^$відповідає порожньому рядку, оскільки він шукає "початок рядка" (^), а потім відразу після, "кінець рядка" ($).
keyser


4

Мені найпростіший спосіб ->

        echo "Hello my name is Donald" | sed  s/\ //g



2

Чувак, просто python test.py у своєму терміналі.

f = open('/home/hduser/Desktop/data.csv' , 'r')

x = f.read().split()
f.close()

y = ' '.join(x)
f = open('/home/hduser/Desktop/data.csv','w')
f.write(y)
f.close()

Вибачте, що зіткнувся зі старою ланцюжком, але не є f.read().strip("\t\n\r ")більш ефективним?
Яхдіч,

Що робити, якщо є два або більше послідовних пробілів, табуляцій тощо ч / б слів? Я думаю, що ваше рішення стосується пробілів та пробілів. Якщо вам потрібен один лайнер, ви можете легко перетворити наведений вище код.
Агнібеш Чаухан

2

Ця відповідь схожа на іншу, однак, оскільки деякі люди скаржились, що вихід виводиться на STDOUT, я просто пропоную перенаправити його у вихідний файл і перезаписати. Зазвичай я ніколи не пропоную цього, але іноді швидко і брудно працює.

cat file.txt | tr -d " \t\n\r" > file.txt

1

хм ... здається, щось на порядок sed -e "s/[ \t\n\r\v]//g" < hello.txtповинно знаходитись у потрібному стадіоні (здається, у будь-якому випадку це працює під cygwin).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.