Решено: Отрицание регулярного выражения в TR (bash)
Модераторы: /dev/random, Модераторы разделов
-
- Сообщения: 353
- ОС: Ubuntu
Решено: Отрицание регулярного выражения в TR
не могу найти как можно поставить отрицание регулярного выражения в tr.
конкретная задача - заменить все "плохие" символы на знак "_". "Плохие" символы перечисленны в этом регулярном выражении
конкретная задача - заменить все "плохие" символы на знак "_". "Плохие" символы перечисленны в этом регулярном выражении
-
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: Решено: Отрицание регулярного выражения в TR
tr не использует регулярные выражения. Поэтому либо используйте sed, либо tr -c:
user@localhost
$ echo -n '123abc, - ,zyx654' | tr -c '[:alnum:]' '_'; echo
123abc_____zyx654
Мои розовые очки
-
- Сообщения: 353
- ОС: Ubuntu
-
- Сообщения: 353
- ОС: Ubuntu
Re: Решено: Отрицание регулярного выражения в TR
а почему вот такой код
в конце преобразования почему то лепит лишний знак "_"?
Код: Выделить всё
tr 'A-Z' 'a-z' $1 | tr -c '[:alnum:]' '_'; echo
в конце преобразования почему то лепит лишний знак "_"?
Код: Выделить всё
i229236@kerulen:~/scripts/9.11$ echo SSS | ./3.sh
sss_
i229236@kerulen:~/scripts/9.11$
-
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: Решено: Отрицание регулярного выражения в TR
Концы строк в файле не виндовые случайно?amorphius писал(а): ↑22.11.2009 15:54а почему вот такой код
Код: Выделить всё
tr 'A-Z' 'a-z' $1 | tr -c '[:alnum:]' '_'; echo
в конце преобразования почему то лепит лишний знак "_"?
Код: Выделить всё
i229236@kerulen:~/scripts/9.11$ echo SSS | ./3.sh sss_ i229236@kerulen:~/scripts/9.11$
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
-
- Сообщения: 353
- ОС: Ubuntu
Re: Решено: Отрицание регулярного выражения в TR
все делается под Debian lenny, неоткуда винде взяться. Файлы писал сам в линуксе с помощью kwrite
-
- Сообщения: 2223
- Статус: Не очень злой админ :-)
- ОС: SuSE, CentOS, FreeBSD, Windows
Re: Решено: Отрицание регулярного выражения в TR
Для того, чтобы получить CR/LF на концах строк, необязательно иметь Windows. Это и kwrite умеет делать:
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- Сообщения: 353
- ОС: Ubuntu
Re: Решено: Отрицание регулярного выражения в TR
показываю весь скрипт, чтоб конкретику внести
скрипт переименовывает рекурсивно все файлы и папки в текущем каталоге - все в нижний регистр переводит, а "плохие" символы заменяет на "_".
скрипт 3 выполняет роль фильтра.
Причем здесь концы строк? Посмотрел в kwrite - концы стоят UNIX-style
Код: Выделить всё
#!/bin/bash
CUR=`pwd`
exec 2> /dev/null
rename() {
for i in *
do
if [ -d $i ]; then
newname=`echo $i | $CUR/3`
len=${#newname}
newname=${newname:0:$len-1}
mv "$i" "$newname"
cd "$newname"
rename
cd ..
elif [ -e $i ]; then
newname=`echo $i | $CUR/3`
len=${#newname}
if [ $len -eq 0 ]; then echo "i= $i"; fi
newname=${newname:0:$len-1}
mv $i $newname
fi
done
return
}
rename
скрипт переименовывает рекурсивно все файлы и папки в текущем каталоге - все в нижний регистр переводит, а "плохие" символы заменяет на "_".
скрипт 3 выполняет роль фильтра.
Причем здесь концы строк? Посмотрел в kwrite - концы стоят UNIX-style
-
- Администратор
- Сообщения: 5404
- ОС: Gentoo
Re: Решено: Отрицание регулярного выражения в TR
Код: Выделить всё
$ echo qwerty | hexdump -c
0000000 q w e r t y \n
0000007
$ echo qwerty | tr -c '[:alnum:]' '_' | hexdump -c
0000000 q w e r t y _
0000007
Понятно?
-
- Сообщения: 353
- ОС: Ubuntu
Re: Решено: Отрицание регулярного выражения в TR
да, вполне, спасибо

-
- Сообщения: 353
- ОС: Ubuntu
Re: Решено: Отрицание регулярного выражения в TR
ну это очень частный случай, а что делать, если мне надо заменить все символы, кроме определенных на символ _?
Например, как заменить во входящей строке все символы, кроме "asdf" на знаки подчеркивания?
Например, как заменить во входящей строке все символы, кроме "asdf" на знаки подчеркивания?
-
- Сообщения: 1744
- Статус: Ъ-участник
- ОС: Debian/Ubuntu/etc
Re: Решено: Отрицание регулярного выражения в TR
[asdf] -- любой из символов "a", "s", "d", "f".
[^asdf]-- любой символ, кроме "a", "s", "d", "f".
Так же ещё можно использовать отрицание условия: "!"
Например,
[^asdf]-- любой символ, кроме "a", "s", "d", "f".
Так же ещё можно использовать отрицание условия: "!"
Например,
Код: Выделить всё
find ~ ! -regex 'mp3'
-
- Сообщения: 1685
- ОС: SuSe 10.2
Re: Решено: Отрицание регулярного выражения в TR
теперь у меня 2 вопроса.
1) "for i in *" - это поиск по всем файлам в текущем каталоге? т.е. если вместо * подставить строку - она будет интерпретироваться как маска?
потому что я пока пользовался для перебора файлов в директории выражением вида "filelist=$(ls $dir); for file in $filelist "... это сильно хуже/лучше?
2) как обозначить в шаблоне на который мы заменяем перевод строки? т.е. мне надо в строке "]],[[" заменить запятую на перевод строки и ещё пару символов. не подскажете как?
1) "for i in *" - это поиск по всем файлам в текущем каталоге? т.е. если вместо * подставить строку - она будет интерпретироваться как маска?
потому что я пока пользовался для перебора файлов в директории выражением вида "filelist=$(ls $dir); for file in $filelist "... это сильно хуже/лучше?
2) как обозначить в шаблоне на который мы заменяем перевод строки? т.е. мне надо в строке "]],[[" заменить запятую на перевод строки и ещё пару символов. не подскажете как?
-
- Сообщения: 1744
- Статус: Ъ-участник
- ОС: Debian/Ubuntu/etc
Re: Решено: Отрицание регулярного выражения в TR
А создать новую тему (даже две) не судьба?