2017-03-02 3 views
4

Ich habe diese Saite:shell - ersetzen String Wert erhöhen

"a | a | a | a | a | a | a | a" 

und ich möchte jeden ersetzen | wie so mit einem Inkrementieren Wert "":

"a0a1a2a3a4a5a6a" 

Ich kann weiß ich verwenden gsub in Strings zu ersetzen:

> echo "a | a | a | a | a | a | a | a" | awk '{gsub(/\ \|\ /, ++i)}1' 
a1a1a1a1a1a1a1a 

aber es scheint nur nach jedem newline erhöht gsub, so meine Lösung für jetzt würde zuerst puttin sein g ein Zeilenumbruch nach jedem "| “, Dann gsub verwenden und die Zeilenumbrüche zu löschen wieder:

> echo "a | a | a | a | a | a | a | a" | awk '{gsub(/\ \|\ /, " | \n")}1' | awk '{gsub(/\ \|\ /, ++i)}1' | tr -d '\n' 
a1a2a3a4a5a6a7a 

Welche ehrlich ist einfach ekelhaft ...

Gibt es einen besseren Weg, dies zu tun

Antwort

3

Sie awk wie diese verwenden kann?:

s="a | a | a | a | a | a | a | a" 

awk -F ' *\\| *' -v OFS="" '{s=""; for(i=1; i<NF; i++) s = s $i i-1; print s $i}' <<< "$s" 

a0a1a2a3a4a5a6a 
  • -F ' *\\| *' wird Sets | von opti umgeben onale Leerzeichen als Eingabefeldtrennzeichen.
  • for Schleife läuft nur durch jedes Feld und hängt Feld inkrementierende Position nach jedem Feld an.
7

Wenn perl ist in Ordnung:

$ echo 'a | a | a | a | a | a | a | a' | perl -pe 's/ *\| */$i++/ge' 
a0a1a2a3a4a5a6a 
  • *\| * Spiel | umgeben von null oder mehr Räumen
  • e Modifikator Perl-Code in Ersatzabschnitt
  • $i++ Gebrauchswert von $i verwenden kann und inkrementieren (Standardwert 0)
0

Eine andere Lösung awk mit

echo "a | a | a | a | a | a | a | a" | 
awk -v RS="[ ]+[|][ ]+" '{printf "%s%s",(f?NR-2:""),$0; f=1}' 

Sie erhalten,

a0a1a2a3a4a5a6a 
0

Bei der Verwendung von nur sh eine Option ist, dann vielleicht ersetzen, bis ein fester Punkt erreicht ist:

s=$1 # first argument passed to script, "a | a | a |..." 

n=0 
while true 
do 
    prev=$s 
    s=${s%" | a"} 
    test "$s" = "$prev" && break 
    result=$result${n}"a" 
    n=$((n + 1)) 
done 
echo $s$result 

Wenn dieses Programm in Skriptdatei digits.sh,

$ sh digits.sh "a | a | a | a | a | a | a | a" 
a0a1a2a3a4a5a6a 
$