Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: host 27. 01. 2019, 19:18:24
-
Ahoj,
může mi prosím někdo poradit, jak v bash opravit údaje v souboru za znakem = podle ID před znakem =? Děkuji
41564=aaa aaa
7564=bbb bbb
874=ccc ccc
15=ddd ddd
-
awk, sed
-
Domácí úkol? Přečti si skripta: https://www.root.cz/clanky/hratky-z-radky-tr-sed-awk-a-ti-dalsi/ (https://www.root.cz/clanky/hratky-z-radky-tr-sed-awk-a-ti-dalsi/) ;D
-
Není jasné co chceš. Ukaž jak má vypadat výsledek po nahrazení.
-
Čísla vlevo jsou jako ID toho textu a dejme tomu, že chci nahradit text s ID 874
před opravou
41564=aaa aaa
7564=bbb bbb
874=ccc ccc
15=ddd ddd
po opravě
41564=aaa aaa
7564=bbb bbb
874=ccc2 ccc2
15=ddd ddd
-
ze by:
echo '41564=aaa aaa' | awk -F'=' '{print $2"="$1}'
-
Jako domácí úkol ti to asi neprojde, ale pro zajímavost :-)
$ cat data.txt
41564=aaa aaa
7564=bbb bbb
874=ccc ccc
15=ddd ddd
$ cat data.txt \
| perl -ne 'if (/([^=]+)=(.*)/) { print "$1\0$2\0"; }' \
| relpipe-in-cli generate-from-stdin data 2 id integer hodnota string \
| relpipe-tr-guile 'data' '(if (= $id 874) (set! $hodnota "ccc2 ccc2") ) #t' \
| relpipe-out-tabular
data:
╭──────────────┬──────────────────╮
│ id (integer) │ hodnota (string) │
├──────────────┼──────────────────┤
│ 41564 │ aaa aaa │
│ 7564 │ bbb bbb │
│ 874 │ ccc2 ccc2 │
│ 15 │ ddd ddd │
╰──────────────┴──────────────────╯
Record count: 4
$ cat data.txt \
| perl -ne 'if (/([^=]+)=(.*)/) { print "$1\0$2\0"; }' \
| relpipe-in-cli generate-from-stdin data 2 id integer hodnota string \
| relpipe-tr-guile 'data' '(if (= $id 874) (set! $hodnota "ccc2 ccc2") ) #t' \
| relpipe-out-nullbyte \
| while read_nullbyte id hodnota; do echo "$id=$hodnota"; done
41564=aaa aaa
7564=bbb bbb
874=ccc2 ccc2
15=ddd ddd
-
sed -i 's/^874=.*$/874=ccc2 ccc2/g' data.txt
-
sypem si popol na hlavu, som si povodne myslel ze ich treba prehodit, kazdopadne tu je opravene awk riesenie:
cat data.txt | awk -F'=' '{if ($2=="ccc ccc") $2="ccc2 ccc2"; print $1"="$2}'
ale skor sa priklanam k sed rieseniu od czipisa
-
ruby
ruby -pe '$_.gsub!(/ccc/, "ccc2") if /874/' < data.txt
nebo perl
perl -pe 's/ccc/ccc2/g if /874/' < data.txt
-
Jako domácí úkol ti to asi neprojde, ale pro zajímavost :-)
Ta zajímavost je, jak moc jsi s tím trapný?
-
Jako domácí úkol ti to asi neprojde, ale pro zajímavost :-)
Ta zajímavost je, jak moc jsi s tím trapný?
Dyť je to hezký, ne?
-
sed -i 's/^\(874=\).*$/\1ccc2 ccc2/' data.ini
-
[...]nahradit text s ID 874[...]
sed '/^874/s/ccc/ccc2/g' -i soubor
-
[...]nahradit text s ID 874[...]
sed '/^874/s/ccc/ccc2/g' -i soubor
Lepsie:
sed '/^874=/s/ccc/ccc2/g' -i soubor
-
echo '874=ccc ccc' | sed -r "s/(874=ccc)(\sccc)/\12\22/g"
-
[...]nahradit text s ID 874[...]
sed '/^874/s/ccc/ccc2/g' -i soubor
Lepsie:
sed '/^874=/s/ccc/ccc2/g' -i soubor
nejen lepsi, ale nutne, to mi vypadlo kdyz sem to v noci psal z mobilu :-) bez = samozrejme by to nahrazovalo i radky 874cokoliv=
diky za opravdu :-)
-
Lepsie:
sed '/^874=/s/ccc/ccc2/g' -i soubor
nejen lepsi, ale nutne, to mi vypadlo kdyz sem to v noci psal z mobilu :-) bez = samozrejme by to nahrazovalo i radky 874cokoliv=
diky za opravdu :-)
Řetězec "ccc" není znám.
-
Řetězec "ccc" není znám.
ses si jistej? podle (https://forum.root.cz/index.php?topic=20672.msg305990#msg305990) ho mozna zna, mozna ne, mozna nevi co chce, protoze pri zadavani ukolu byl zrovna na zachode :-)
-
Řetězec "ccc" není znám.
ses si jistej? podle (https://forum.root.cz/index.php?topic=20672.msg305990#msg305990) ho mozna zna, mozna ne, mozna nevi co chce, protoze pri zadavani ukolu byl zrovna na zachode :-)
podle ID před znakem =
-
podle ID před znakem =
"před opravou: 874=ccc ccc
po opravě: 874=ccc2 ccc2"
podle me neni jasne, jestli pokud za = nezna, jestli vi ze to bude vzdy neco stejneho 2x a/nebo ze za kazdej vyskyt pridat 2, treba timto prikladem chtel rict "na radku s 874 zmenit at uz je tam cokoliv za 'hamburger'"