S GNU sed nahrazením všech mezer v eol podtržítkem:
sed ':x;s/ \( *\)$/_\1/;tx'
Efektivnější použití perlu:
perl -lpe 's/(\s+)$/"_" x length($1)/e' input.txt
který musí provést pouze jednu substituci na řádek s koncovými mezerami namísto smyčkování.
S GNU awk pro 3. arg to match() a gensub():
$ awk 'match($0,/(.*[^ ])(.*)/,a){$0=a[1] gensub(/ /,"_","g",a[2])} 1' file
foo bar_____
foo bar oof
line 3a___
line fo a_
S jakýmkoliv 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_
Chcete-li také nahradit přední mezery vyladěním výše uvedeného řešení:
$ 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_
Jak mohu rekurzivně odstranit všechny prázdné soubory a adresáře v Linuxu?
Jak najít konkrétní slovo a uchopit text