Решено: Отрицание регулярного выражения в TR (bash)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
amorphius
Сообщения: 353
ОС: Ubuntu

Решено: Отрицание регулярного выражения в TR

Сообщение amorphius »

не могу найти как можно поставить отрицание регулярного выражения в tr.
конкретная задача - заменить все "плохие" символы на знак "_". "Плохие" символы перечисленны в этом регулярном выражении
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Решено: Отрицание регулярного выражения в TR

Сообщение watashiwa_daredeska »

tr не использует регулярные выражения. Поэтому либо используйте sed, либо tr -c:

user@localhost

$ echo -n '123abc, - ,zyx654' | tr -c '[:alnum:]' '_'; echo 123abc_____zyx654
Спасибо сказали:
Аватара пользователя
amorphius
Сообщения: 353
ОС: Ubuntu

Re: Решено: Отрицание регулярного выражения в TR

Сообщение amorphius »

ок, спс
Спасибо сказали:
Аватара пользователя
amorphius
Сообщения: 353
ОС: Ubuntu

Re: Решено: Отрицание регулярного выражения в TR

Сообщение amorphius »

а почему вот такой код

Код: Выделить всё

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$
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Решено: Отрицание регулярного выражения в TR

Сообщение t.t »

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нεиж
Спасибо сказали:
Аватара пользователя
amorphius
Сообщения: 353
ОС: Ubuntu

Re: Решено: Отрицание регулярного выражения в TR

Сообщение amorphius »

все делается под Debian lenny, неоткуда винде взяться. Файлы писал сам в линуксе с помощью kwrite
Спасибо сказали:
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows

Re: Решено: Отрицание регулярного выражения в TR

Сообщение allez »

amorphius писал(а):
23.11.2009 21:07
все делается под Debian lenny, неоткуда винде взяться. Файлы писал сам в линуксе с помощью kwrite
Для того, чтобы получить CR/LF на концах строк, необязательно иметь Windows. Это и kwrite умеет делать:
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Спасибо сказали:
Аватара пользователя
amorphius
Сообщения: 353
ОС: Ubuntu

Re: Решено: Отрицание регулярного выражения в TR

Сообщение amorphius »

показываю весь скрипт, чтоб конкретику внести

Код: Выделить всё

#!/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
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: Решено: Отрицание регулярного выражения в TR

Сообщение /dev/random »

Код: Выделить всё

$ 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

Понятно?
Спасибо сказали:
Аватара пользователя
amorphius
Сообщения: 353
ОС: Ubuntu

Re: Решено: Отрицание регулярного выражения в TR

Сообщение amorphius »

да, вполне, спасибо:)
Спасибо сказали:
Аватара пользователя
amorphius
Сообщения: 353
ОС: Ubuntu

Re: Решено: Отрицание регулярного выражения в TR

Сообщение amorphius »

ну это очень частный случай, а что делать, если мне надо заменить все символы, кроме определенных на символ _?
Например, как заменить во входящей строке все символы, кроме "asdf" на знаки подчеркивания?
Спасибо сказали:
sciko
Сообщения: 1744
Статус: Ъ-участник
ОС: Debian/Ubuntu/etc

Re: Решено: Отрицание регулярного выражения в TR

Сообщение sciko »

[asdf] -- любой из символов "a", "s", "d", "f".
[^asdf]-- любой символ, кроме "a", "s", "d", "f".

Так же ещё можно использовать отрицание условия: "!"
Например,

Код: Выделить всё

find ~ ! -regex 'mp3'
Спасибо сказали:
Аватара пользователя
Denjs
Сообщения: 1685
ОС: SuSe 10.2

Re: Решено: Отрицание регулярного выражения в TR

Сообщение Denjs »

теперь у меня 2 вопроса.
1) "for i in *" - это поиск по всем файлам в текущем каталоге? т.е. если вместо * подставить строку - она будет интерпретироваться как маска?
потому что я пока пользовался для перебора файлов в директории выражением вида "filelist=$(ls $dir); for file in $filelist "... это сильно хуже/лучше?
2) как обозначить в шаблоне на который мы заменяем перевод строки? т.е. мне надо в строке "]],[[" заменить запятую на перевод строки и ещё пару символов. не подскажете как?
QDroid - Среда исполнения и фреймворк для QtScript.
OTPD - Открытые драйвера промышленных принтеров чеков и этикеток (кроссплатформенная подсистема печати).
Спасибо сказали:
sciko
Сообщения: 1744
Статус: Ъ-участник
ОС: Debian/Ubuntu/etc

Re: Решено: Отрицание регулярного выражения в TR

Сообщение sciko »

А создать новую тему (даже две) не судьба?
Спасибо сказали: