Замените каждый пробел в конце каждой строки на '_'

Используйте 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'

запретить
6
27.03.2020, 21:20
3 ответа

С 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_
3
19.03.2021, 02:32

Perl более эффективен:

perl -lpe 's/(\s+)$/"_" x length($1)/e' input.txt

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

4
19.03.2021, 02:32

Вы также можете сделать это с помощью следующих простых методов:

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 
0
19.03.2021, 02:32

Теги

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