Вы не должны использовать {}, если Вы не собираетесь использовать параметры переменной удара, или непосредственный добавляют символ, который был бы допустим как часть идентификатора. Вы также не должны использовать двойные кавычки, если Вы параметры не будете включать специальные символы.
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"
С 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'
.
Используя tr
:
tr -s '[:blank:]' ',' <file
Это заменит любой горизонтальный пробел запятой. Любой повторный пробел будет только заменен единственной запятой.
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]$
~$ vim filename
:set nu
(только для установки линий):%s/ /,/g
(это заменит пробел на запятую):wq!
(сохранить и выйти)Проблема с вашей командой,
sed 's/[:blank:]+/,/g' orig.txt > modified.txt
двоится:
[:blank:]
— это выражение в квадратных скобках, соответствующее одному из символов :
, a
, b
, k
, l
или n
. Если вы хотите сопоставить один из символов в классе символов POSIX [:blank:]
, используйте [[:blank:]]
.
+
— это расширенный модификатор регулярного выражения. Утилита 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
приводит к тому, что несколько последовательных запятых «сжимаются» в одиночные запятые.
+
оператор в sed, я просто обновил свой ответ. Новые строки являются пробелом в жемчуге, таким образом, необходимо будет сделать пробельный класс вручную, если Вы не делаете wnat для включения его. Я добавил два решения для этого как wel. – Caleb 22.04.2011, 11:41