Используйте shopt -sq expand_aliases
, например, этот код в кодировке UTF -8:
#!/bin/bash
function запрещать() {
if [ $1 -eq 3 ]
then
echo -n "Запрещено. Код ошибки: "
echo `expr 2 \* 3 \* 47`
else
echo -n "."
запрещать `expr $1 + 1`
fi
}
#function запретить() {
# запрещать 1
#}
shopt -sq expand_aliases
alias запретить='запрещать 1'
запретить
С GNU awk для соответствия третьего аргумента ()и gensub():
$ awk 'match($0,/(.*[^ ])(.*)/,a){$0=a[1] gensub(/ /,"_","g",a[2])} 1' file
foo bar_____
foo bar oof
line 3a___
line fo a_
С любым awk:
$ awk 'match($0,/ +$/){tail=substr($0,RSTART,RLENGTH); gsub(/ /,"_",tail); $0=substr($0,1,RSTART-1) tail} 1' file
foo bar_____
foo bar oof
line 3a___
line fo a_
Также заменить начальные пробелы, изменив приведенное выше решение gawk:
$ awk 'match($0,/^( *)(.*[^ ])(.*)/,a){$0=gensub(/ /,"_","g",a[1]) a[2] gensub(/ /,"_","g",a[3])} 1' file
foo bar_____
_foo bar oof
__line 3a___
__line fo a_
Perl более эффективен:
perl -lpe 's/(\s+)$/"_" x length($1)/e' input.txt
который должен делать только одну замену в строке с конечным пробелом, вместо того, чтобы зацикливаться.
Вы также можете сделать это с помощью следующих простых методов:
Perl разбивается на непробельные символы и выполняет транслитерацию пробелов для подчеркивания в последнем поле. Затем распечатайте все поля.
$ perl -F'(\S+)' -lane '
$F[-1] =~ tr/ /_/ if @F;
print @F;
' file
Используя GNU sed, мы выполняем аналогичный просмотр вперед:
$ sed -re '
y/ /\n/
:loop
s/\n(\S| )/ \1/
tloop
y/\n/_/
' file
Это будет работать правильно (замените \S на [^[ :пробел :]])
$ sed -e '
h;s/\s*$//;x;s/.*\S//
y/ /_/;x;G;s/\n//
' file
Этот метод будет работать только в gnu sed, так как он использует расширенный флаг s///e.
$ sed -re '
s/(.*\S)(.*)/echo "\1""$(echo "\2" | tr " " _)"/e
' file