Portál AbcLinuxu, 4. května 2025 15:37
#!/bin/bash for i in $(find . -name *.txt); do awk '{gsub("^0","",$2); print $1,$2}' $i doneavsak tento skript vypise iba opravene stlpce ale nezapise zmeny do suboru. Viete ma nejako usmernit spravnym smerom ? Dakujem.
#!/bin/bash for i in $(find . -name *.txt); do sed -ri 's/\ 0(.*)$/\ \1/g' $i doneUrizne prvni nulu za mezerou z prava, asi by to slo i elegantneji. Doporucuji nejprve otestovat(bez -i).
find -name "*\.txt" |xargs perl -i -anE '$F[1] =~ s/^0//g;say "@F"'
opět pro zkoušku lze vynechat -i
find -name "*\.txt" |xargs perl -i -pE 's/^\s*\S+\s+\K0//;'
.
nebo jen zvětšit mezery: find -name "*\.txt" |xargs perl -i -anE '$"="\t";$F[1] =~ s/^0//g;say "@F"'
Tvůj pokus má jednu vadu: nezachovává sloupce následující po druhém sloupci.
Tady je můj výstřel do tmy, který soubory už přímo edituje a zachovává všechny sloupce. Počítá s tabulátory jako oddělovači, ale klidně si tam lze dosadit místo \t
mezery nebo skupiny znaků.
find . -name '*.txt' -exec sed -ir \ 's/(^[\t]*[^\t]+[\t]+)0(.*$)/\1\2/' '{}' +Co když je v tom druhém sloupci pouze jedna samotná nula nebo více nul a nic nenulového za nimi? Pak by tam asi měla zůstat právě jedna nula, že ano. To bych udělal zhruba takto:
find . -name '*.txt' -exec sed -ir \ 's/(^[\t]*[^\t]+[\t]+)0+(([^\t0]|0).*$)/\1\2/' '{}' +
Tohle^^^ by mělo druhý sloupec nahradit takto:
0 -> 0 00 -> 0 000 -> 0 ... cosi -> cosi 0cosi -> cosi 00cosi -> cosi ...
Aha. Teď v diskusi výše vidím, že oddělovače jsou mezery. Takže:
find . -name '*.txt' -exec sed -ir \ 's/(^ *[^ ]+ +)0(.*$)/\1\2/' '{}' +
find . -name '*.txt' -exec sed -ir \ 's/(^ *[^ ]+ +)0+(([^ 0]|0).*$)/\1\2/' '{}' +
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.