Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: host 27. 01. 2019, 19:18:24

Název: BASH - Jak nahradit text v souboru
Přispěvatel: 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
Název: Re:BASH - Jak nahradit text v souboru
Přispěvatel: Kachna 27. 01. 2019, 19:26:07
awk, sed
Název: Re:BASH - Jak nahradit text v souboru
Přispěvatel: Radovan. 27. 01. 2019, 19:30:13
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
Název: Re:BASH - Jak nahradit text v souboru
Přispěvatel: gll 27. 01. 2019, 19:44:39
Není jasné co chceš. Ukaž jak má vypadat výsledek po nahrazení.
Název: Re:BASH - Jak nahradit text v souboru
Přispěvatel: host 27. 01. 2019, 20:21:21
Čí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
Název: Re:BASH - Jak nahradit text v souboru
Přispěvatel: peter 27. 01. 2019, 20:43:57
ze by:

echo '41564=aaa aaa' | awk -F'=' '{print $2"="$1}'
Název: Re:BASH - Jak nahradit text v souboru
Přispěvatel: Franta <xkucf03/> 27. 01. 2019, 20:44:59
Jako domácí úkol ti to asi neprojde, ale pro zajímavost :-)

Kód: [Vybrat]
$ cat data.txt
41564=aaa aaa
7564=bbb bbb
874=ccc ccc
15=ddd ddd

Kód: [Vybrat]
$ 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

Kód: [Vybrat]
$ 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
Název: Re:BASH - Jak nahradit text v souboru
Přispěvatel: czipis 27. 01. 2019, 21:01:27
Kód: [Vybrat]
sed -i 's/^874=.*$/874=ccc2 ccc2/g' data.txt
Název: Re:BASH - Jak nahradit text v souboru
Přispěvatel: peter 27. 01. 2019, 21:21:26
sypem si popol na hlavu, som si povodne myslel ze ich treba prehodit, kazdopadne tu je opravene awk riesenie:

Kód: [Vybrat]
cat data.txt | awk -F'=' '{if ($2=="ccc ccc") $2="ccc2 ccc2"; print $1"="$2}'
ale skor sa priklanam k sed rieseniu od czipisa
Název: Re:BASH - Jak nahradit text v souboru
Přispěvatel: gll 27. 01. 2019, 21:39:28
ruby

Kód: [Vybrat]
ruby -pe '$_.gsub!(/ccc/, "ccc2") if /874/' < data.txt

nebo perl

Kód: [Vybrat]
perl -pe 's/ccc/ccc2/g if /874/' < data.txt
Název: Re:BASH - Jak nahradit text v souboru
Přispěvatel: . 27. 01. 2019, 22:59:04
Jako domácí úkol ti to asi neprojde, ale pro zajímavost :-)
Ta zajímavost je, jak moc jsi s tím trapný?
Název: Re:BASH - Jak nahradit text v souboru
Přispěvatel: Kit 27. 01. 2019, 23:06:41
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?
Název: Re:BASH - Jak nahradit text v souboru
Přispěvatel: Kit 27. 01. 2019, 23:16:57
Kód: [Vybrat]
sed -i 's/^\(874=\).*$/\1ccc2 ccc2/' data.ini
Název: Re:BASH - Jak nahradit text v souboru
Přispěvatel: k3dAR 28. 01. 2019, 01:41:16
[...]nahradit text s ID 874[...]
Kód: [Vybrat]
sed '/^874/s/ccc/ccc2/g' -i soubor
Název: Re:BASH - Jak nahradit text v souboru
Přispěvatel: aaa158 28. 01. 2019, 10:02:22
[...]nahradit text s ID 874[...]
Kód: [Vybrat]
sed '/^874/s/ccc/ccc2/g' -i soubor

Lepsie:
Kód: [Vybrat]
sed '/^874=/s/ccc/ccc2/g' -i soubor
Název: Re:BASH - Jak nahradit text v souboru
Přispěvatel: snuff1987 28. 01. 2019, 12:39:33
echo '874=ccc ccc' | sed -r "s/(874=ccc)(\sccc)/\12\22/g"
Název: Re:BASH - Jak nahradit text v souboru
Přispěvatel: k3dAR 28. 01. 2019, 12:42:55
[...]nahradit text s ID 874[...]
Kód: [Vybrat]
sed '/^874/s/ccc/ccc2/g' -i soubor

Lepsie:
Kód: [Vybrat]
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 :-)
Název: Re:BASH - Jak nahradit text v souboru
Přispěvatel: Kit 28. 01. 2019, 12:53:25
Lepsie:
Kód: [Vybrat]
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.
Název: Re:BASH - Jak nahradit text v souboru
Přispěvatel: k3dAR 28. 01. 2019, 12:59:46
Ř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 :-)
Název: Re:BASH - Jak nahradit text v souboru
Přispěvatel: Kit 28. 01. 2019, 13:28:21
Ř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 :-)

Citace
podle ID před znakem =
Název: Re:BASH - Jak nahradit text v souboru
Přispěvatel: k3dAR 28. 01. 2019, 13:38:15
Citace
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'"