Minulla on tällaisia rivejä määritystiedostoissani,
bindsym $mod+F2 exec gnome-terminal #Open terminal bindsym $mod+p exec command /some/path" #Popup Dictionary bindsym $mod+Mod1+l exec --no-startup-id /some/path/command #Dmenu for my books collection bindsym Mod1+Control+b exec rxvt -e nnn #nnn file browser
Haluan awk
poistaa toisen sarakkeen ja asiat, jotka ovat #
jälkeen. Käytän awk
-tunnusta
awk "/bindsym/{print $2}" filename
En ole kuitenkaan varma, kuinka saada teksti #
.
Ensisijainen lähtö on, avaimet ja sitten kommenttiteksti
$mod+F2 Open terminal
Vastaus
$ awk -v OFS="\t" "/^bindsym/ { key = $2; sub(".*#", ""); print key, $0 }" file $mod+F2 Open terminal $mod+p Popup Dictionary $mod+Mod1+l Dmenu for my books collection Mod1+Control+b nnn file browser
Tämä käyttää awk
purkamaan jokaisen rivin toisen kentän ensin alkaen bindsym
muuttujaan key
. Sitten se poistaa kaiken riviin #
asti ja tulostaa key
ja mitä rivillä on jäljellä välilehdellä erotin.
Vaihtoehtoinen lähdön muotoilu:
$ awk "/^bindsym/ { key = $2; sub(".*#", ""); printf("%-20s\t%-20s\n", key, $0) }" file $mod+F2 Open terminal $mod+p Popup Dictionary $mod+Mod1+l Dmenu for my books collection Mod1+Control+b nnn file browser
Logiikka on sama, mutta ulostulo varaa 20 merkkiä molemmille ( vasemmalle perustellut) kentät ja laittaa välilehden niiden väliin (hyvästä syystä).
Vastaa
match()
GNU-funktio awk
vastaamaan osaa #
rivin loppuun
awk "/bindsym/ && match($0,/#(.+)$/,arr){print $2, arr[1]}" filep
Funktio match()
täyttää kolmannen argumentin mukaisen taulukon toisen argumentin vastaavalla kaavalla. .
missä tahansa POSIXissa awk
, match()
: n kolmas argumentti ei ole tuettu , mutta pari erikoismuuttujaa RSTART
ja RLENGTH
, jotka merkitsevät vastaavan ryhmän alku ja pituus . Käytämme nykyisen rivin substr()
-funktiota vastaavan merkkijonon saamiseksi
awk "/bindsym/ && match($0,/#(.+)$/){print $2, substr($0,RSTART+1,RLENGTH)}" file
Tulostuksen kauniiseen tulostamiseen , voit joko käyttää printf()
-toimintoa kuten toisessa vastauksessa.
Vastaa
Tämä on hyvin helppo tehdä tiedostossa sed
; koska tietosi eivät ole oikeastaan kenttäkeskeisiä Awk, niistä ei ole valtavaa hyötyä:
sed "s/^[^ ]* //;s/ .*#//" inputfile
Käännös:
s/^[^ ]* //
Poista kaikki merkit ensimmäiseen välimerkkiin asti.
s/ .*#//
Poista kaikki ensimmäisestä (jäljellä olevasta) välilyönnistä, rivin viimeiseen #
-merkkiin asti.
Vastaa
Step1: count=`awk "{print NR}"|sed -n "$p" filename` Step2:for ((i=1;i<=$count;i++)); do awk -v i="$i" "NR==i && $0 ~ /^bindsym/{print $2}" filename; sed -n ""$i"s/.*#//p" filename; done| sed "N;s/\n/ /g" output for ((i=1;i<=$count;i++)); do awk -v i="$i" "NR==i && $0 ~ /^bindsym/{print $2}" filename; sed -n ""$i"s/.*#//p" filename; done| sed "N;s/\n/ /g" $mod+F2 Open terminal $mod+p Popup Dictionary $mod+Mod1+l Dmenu for my books collection Mod1+Control+b nnn file browser
Kommentit
- I ' m olettaen, että rivissä voi olla enemmän kuin neljä riviä syötetiedosto. Ei ole selvää, mitä ensimmäinen askel tekisi, paitsi tulostaa rivinumero päätelaitteessa.
- Koodin korjaaminen
- Koodin korjaaminen