Замените все пробелы запятыми в текстовом файле

Вы не должны использовать {}, если Вы не собираетесь использовать параметры переменной удара, или непосредственный добавляют символ, который был бы допустим как часть идентификатора. Вы также не должны использовать двойные кавычки, если Вы параметры не будете включать специальные символы.

x=foo
y=bar
z=$x$y        # $z is now "foobar"
z="$x$y"      # $z is still "foobar"
z="$xand$y"   # does not work
z="${x}and$y" # does work, "fooandbar"
z="$x and $y" # does work, "foo and bar"
10
22.04.2011, 11:23
5 ответов

С sed:

sed -e 's/\s\+/,/g' orig.txt > modified.txt

Или с perl:

perl -pne 's/\s+/,/g' < orig.txt > modified.txt

Править: Для исключения новых строк в жемчуге, Вы могли использовать двойное отрицание 's/[^\S\n]+/,/g' или соответствие против просто пробельных символов по Вашему выбору 's/[ \t\r\f]+/,/g'.

12
27.01.2020, 20:00
  • 1
    Спасибо, однако существует все еще проблема: Я не хочу заменять "следующие строки \n" запятой, и команда с жемчугом в настоящее время делает ее. Она sed управляют Вами, записала, это все еще не работает. –  aneuryzm 22.04.2011, 11:29
  • 2
    Извините, необходимо выйти + оператор в sed, я просто обновил свой ответ. Новые строки являются пробелом в жемчуге, таким образом, необходимо будет сделать пробельный класс вручную, если Вы не делаете wnat для включения его. Я добавил два решения для этого как wel. –  Caleb 22.04.2011, 11:41

Используя tr:

tr -s '[:blank:]' ',' <file

Это заменит любой горизонтальный пробел запятой. Любой повторный пробел будет только заменен единственной запятой.

12
27.01.2020, 20:00
awk '{print $1","}' Servers | tr -d '[\n]' | xargs echo 

Здесь имя файла - Servers .. Он содержит следующее содержимое ..

Server1
Server2
Server3

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

Server1,Server2,Server3,


[mohramak@oc3246038448 Desktop]$ cat Servers
Server1
Server2
Server3
[mohramak@oc3246038448 Desktop]$ awk '{print $1","}' Servers | tr -d '[\n]' | xargs echo 
Server1,Server2,Server3,
[mohramak@oc3246038448 Desktop]$ 
-1
27.01.2020, 20:00
  • ~$ vim filename
  • :set nu(только для установки линий)
  • :%s/ /,/g(это заменит пробел на запятую)
  • :wq!(сохранить и выйти)
0
06.03.2021, 09:21

Проблема с вашей командой,

sed 's/[:blank:]+/,/g' orig.txt > modified.txt

двоится:

  1. [:blank:]— это выражение в квадратных скобках, соответствующее одному из символов :, a, b, k, lили n. Если вы хотите сопоставить один из символов в классе символов POSIX [:blank:], используйте [[:blank:]].

  2. +— это расширенный модификатор регулярного выражения. Утилита sedиспользует базовые регулярные выражения, а +соответствует буквальному символу +. Чтобы получить тот же эффект в базовом регулярном выражении, используйте \{1,\}или, в этом конкретном выражении, вместо этого используйте [[:blank:]][[:blank:]]*.

Короче говоря, ваше исправленное sedвыражение будет

sed 's/[[:blank:]]\{1,\}/,/g' orig.txt >modified.txt

или

sed 's/[[:blank:]][[:blank:]]*/,/g' orig.txt >modified.txt

Как указывали другие, и предполагая однобайтовые символы ASCII в тексте, в этом случае может быть более эффективно использовать tr, так как это простая транслитерация одного набора символов в другой.Любая из следующих двух команд trрешит проблему:

tr -s '[:blank:]' '[,*]' <orig.txt >modified.txt

где [,*]означает «столько запятых, сколько необходимо для этого набора, чтобы соответствовать количеству символов в первом наборе», или

tr -s '\t ' ',,' <orig.txt >modified.txt

Параметр -sдля trприводит к тому, что несколько последовательных запятых «сжимаются» в одиночные запятые.

2
06.03.2021, 10:27

Теги

Похожие вопросы