Domanda Cercando di incorporare newline in una variabile in bash [duplicato]


Questa domanda ha già una risposta qui:

io ho

var="a b c"
for i in $var
do
   p=`echo -e $p'\n'$i`
done
echo $p

Voglio l'ultima eco da stampare

a
b
c

Si noti che voglio che la variabile p contenga le newline. Come lo faccio?


65
2018-02-04 08:03


origine


risposte:


Sommario

  1. inserzione \n

    p="${var1}\n${var2}"
    echo -e "${p}"
    
  2. Inserimento di una nuova riga nel codice sorgente

    p="${var1}
    ${var2}"
    echo "${p}"
    
  3. utilizzando $'\n' (solo  e )

    p="${var1}"$'\n'"${var2}"
    echo "${p}"
    

Dettagli

1. Inserimento \n

p="${var1}\n${var2}"
echo -e "${p}"

echo -e interpreta i due personaggi "\n" come una nuova linea.

var="a b c"
first_loop=true
for i in $var
do
   p="$p\n$i"            # Append
   unset first_loop
done
echo -e "$p"             # Use -e

Evita una nuova riga extra

var="a b c"
first_loop=1
for i in $var
do
   (( $first_loop )) &&  # "((...))" is bash specific
   p="$i"            ||  # First -> Set
   p="$p\n$i"            # After -> Append
   unset first_loop
done
echo -e "$p"             # Use -e

Utilizzando una funzione

embed_newline()
{
   local p="$1"
   shift
   for i in "$@"
   do
      p="$p\n$i"         # Append
   done
   echo -e "$p"          # Use -e
}

var="a b c"
p=$( embed_newline $var )  # Do not use double quotes "$var"
echo "$p"

2. Inserimento di una nuova riga nel codice sorgente

var="a b c"
for i in $var
do
   p="$p
$i"       # New line directly in the source code
done
echo "$p" # Double quotes required
          # But -e not required

Evita una nuova riga extra

var="a b c"
first_loop=1
for i in $var
do
   (( $first_loop )) &&  # "((...))" is bash specific
   p="$i"            ||  # First -> Set
   p="$p
$i"                      # After -> Append
   unset first_loop
done
echo "$p"                # No need -e

Utilizzando una funzione

embed_newline()
{
   local p="$1"
   shift
   for i in "$@"
   do
      p="$p
$i"                      # Append
   done
   echo "$p"             # No need -e
}

var="a b c"
p=$( embed_newline $var )  # Do not use double quotes "$var"
echo "$p"

3. Uso $'\n' (meno portabile)

 e  interpreta $'\n' come una nuova linea.

var="a b c"
for i in $var
do
   p="$p"$'\n'"$i"
done
echo "$p" # Double quotes required
          # But -e not required

Evita una nuova riga extra

var="a b c"
first_loop=1
for i in $var
do
   (( $first_loop )) &&  # "((...))" is bash specific
   p="$i"            ||  # First -> Set
   p="$p"$'\n'"$i"       # After -> Append
   unset first_loop
done
echo "$p"                # No need -e

Utilizzando una funzione

embed_newline()
{
   local p="$1"
   shift
   for i in "$@"
   do
      p="$p"$'\n'"$i"    # Append
   done
   echo "$p"             # No need -e
}

var="a b c"
p=$( embed_newline $var )  # Do not use double quotes "$var"
echo "$p"

L'output è lo stesso per tutti

a
b
c

Un ringraziamento speciale ai contributori di questa risposta: kevinf, Gordon Davisson, l0b0, Dolda2000 e tripleee.


MODIFICARE


115
2018-02-04 09:40



La soluzione banale è mettere quelle newline dove le vuoi.

var="a
b
c"

Sì, è un incarico su più righe.

Tuttavia, dovrai interpolarlo con doppia virgolette, altrimenti la shell la dividerà su spazi bianchi, trasformando efficacemente ogni nuova riga in un singolo spazio (e espandendo anche eventuali caratteri jolly).

echo "$p"

In generale, è necessario inserire due volte tutte le interpolazioni delle variabili a meno che non si desideri specificamente il comportamento sopra descritto.


18
2018-02-04 10:31



Provare echo $'a\nb'.

Se vuoi memorizzarlo in una variabile e poi usarlo con le nuove righe intatto, dovrai citare correttamente il tuo utilizzo:

var=$'a\nb\nc'
echo "$var"

Oppure, per correggere il tuo esempio di programma letteralmente:

var="a b c"
for i in $var; do
    p="`echo -e "$p\\n$i"`"
done
echo "$p"

10
2018-02-04 08:37



Esistono tre livelli in cui è possibile inserire una nuova riga in una variabile.
Bene ..., tecnicamente quattro, ma i primi due sono solo due modi per scrivere la nuova riga nel codice.

1.1. Alla creazione.

Il più basilare è già creare la variabile con le nuove linee.
Scriviamo il valore della variabile in codice con le nuove righe già inserite.

$ var="a
> b
> c"
$ echo "$var"
a
b
c

Oppure, all'interno di un codice di script:

var="a
b
c"

Sì, questo significa scrivere accedere dove necessario nel codice.

1.2. Crea usando la quotatura della shell.

La sequenza $' è una speciale espansione della shell in bash e zsh.

var=$'a\nb\nc'

La riga viene analizzata dalla shell ed estesa a «var =" anuova lineaBnuova lineac "», che è esattamente ciò che vogliamo che la variabile var sia.
Questo sarà non lavorare su shell più vecchie.

2. Utilizzo delle espansioni di shell.

È fondamentalmente un'espansione di comando con diversi comandi:

  1. echo -e

    var="$( echo -e "a\nb\nc" )"
    
  2. Il bash e lo zsh printf '% b'

    var="$( printf '%b' "a\nb\nc" )"
    
  3. Il bash printf -v

    printf -v var '%b' "a\nb\nc"
    
  4. Semplice stampa semplice (funziona sulla maggior parte delle shell):

    var="$( printf 'a\nb\nc' )"
    

3. Utilizzo dell'esecuzione della shell.

Tutti i comandi elencati nella seconda opzione potrebbero essere utilizzati per espandere il valore di una var, se tale var contiene caratteri speciali.
Quindi, tutto ciò che dobbiamo fare è ottenere quei valori all'interno della var ed eseguire qualche comando per mostrare:

var="a\nb\nc"                 # var will contain the characters \n not a newline.

echo -e "$var"                # use echo.
printf "%b" "$var"            # use bash %b in printf.
printf "$var"                 # use plain printf.

Si noti che printf è alquanto pericoloso se il valore var è controllato da un utente malintenzionato.


9
2017-09-26 21:58



non c'è bisogno di usare per il ciclo

puoi beneficiare delle funzioni di espansione dei parametri bash:

var="a b c"; 
var=${var// /\\n}; 
echo -e $var
a
b
c

o semplicemente usa tr:

var="a b c"
echo $var | tr " " "\n"
a
b
c

3
2018-05-18 08:27



sed soluzione:

echo "a b c" | sed 's/ \+/\n/g'

Risultato:

a
b
c

1
2017-07-09 08:04



var="a b c"
for i in $var
do
   p=`echo -e "$p"'\n'$i`
done
echo "$p"

La soluzione consisteva semplicemente nel proteggere la newline inserita con un "" durante l'iterazione corrente quando avviene la sostituzione di una variabile.


-1
2018-05-08 02:39