2010-08-12 4 views
1

Pourriez-vous s'il vous plaît me dire ce que le code BASH équivalent pour l'extrait de code C++ suivant serait:setw et équivalent setfill dans BASH

std::cout << std::setfill('x') << std::setw(7) << 250; 

La sortie est:

xxxx250 

Merci pour l'aide!

Répondre

4

Si vous utilisez Linux, il a un programme printf pour cela. D'autres variantes UNIX peuvent également l'avoir.

Rembourrage un numérique avec x est pas vraiment sur des cas d'utilisation, mais vous pouvez obtenir le même résultat avec:

pax> printf "%7d\n" 250 | tr ' ' 'x' 
xxxx250 

qui délivre 250 avec un rembourrage de l'espace, utilise alors le tr traduire utilitaire pour transformer ces espaces en x caractères.

Si vous cherchez une bash solution -Seulement, vous pouvez commencer par:

pax> n=250 ; echo ${n} 
250 

pax> n=xxxxxxx${n} ; echo ${n} 
xxxxxxx250 

pax> n=${n: -7} ; echo ${n} 
xxxx250 

Si vous voulez une solution généralisée, vous pouvez utiliser cette fonction fmt, le code de test unitaire est inclus :

#!/bin/bash 
# 
# fmt <string> <direction> <fillchar> <size> 
# Formats a string by padding it to a specific size. 
# <string> is the string you want formatted. 
# <direction> is where you want the padding (l/L is left, 
# r/R and everything else is right). 
# <fillchar> is the character or string to fill with. 
# <size> is the desired size. 
# 
fmt() 
{ 
    string="$1" 
    direction=$2 
    fillchar="$3" 
    size=$4 
    if [[ "${direction}" == "l" || "${direction}" == "L" ]] ; then 
     while [[ ${#string} -lt ${size} ]] ; do 
      string="${fillchar}${string}" 
     done 
     string="${string: -${size}}" 
    else 
     while [[ ${#string} -lt ${size} ]] ; do 
      string="${string}${fillchar}" 
     done 
     string="${string:0:${size}}" 
    fi 
    echo "${string}" 
} 

 

# Unit test code. 

echo "[$(fmt 'Hello there' r ' ' 20)]" 
echo "[$(fmt 'Hello there' r ' ' 5)]" 
echo "[$(fmt 'Hello there' l ' ' 20)]" 
echo "[$(fmt 'Hello there' l ' ' 5)]" 
echo "[$(fmt 'Hello there' r '_' 20)]" 
echo "[$(fmt 'Hello there' r ' .' 20)]" 
echo "[$(fmt 250 l 'x' 7)]" 

Ce sorties:

[Hello there   ] 
[Hello] 
[   Hello there] 
[there] 
[Hello there_________] 
[Hello there . . . . ] 
[xxxx250] 

et vous n'êtes pas limité juste de les imprimer, vous pouvez également enregistrer les variables pour plus tard avec une ligne telle que:

formattedString="$(fmt 'Hello there' r ' ' 20)" 
+0

Cela a fonctionné parfaitement. Merci beaucoup! – raytracer

0

Vous pouvez imprimer un rembourrage comme ceci:

printf "x%.0s" {1..4}; printf "%d\n" 250 

Si vous voulez généraliser, malheureusement, vous aurez à utiliser eval:

value=250 
padchar="x" 
padcount=$((7 - ${#value})) 
pad=$(eval echo {1..$padcount}) 
printf "$padchar%.0s" $pad; printf "%d\n" $value 

Vous pouvez utiliser des variables directement dans les expressions de séquence d'accolades dans ksh, mais pas dans Bash.

-1
s=$(for i in 1 2 3 4; do printf "x"; done;printf "250") 
echo $s