Portál AbcLinuxu, 11. listopadu 2025 21:45
1-abcd 20-efgh 300-ijkl 4000-mnoppomůže někdo jak vypsat string "ijkl" pomocí bashe? Znám jenom čísla před pomlčkou, string za pomlčkou neznám. Děkuji za pomoc.
Řešení dotazu:
sedem nebo i tím grepem, když zapneme Perlovské regulární výrazy:
$ cat data.txt 1-abcd 20-efgh 300-ijkl 4000-mnop $ cat data.txt | grep -oP '(?<=300-).*' ijkl
UUoC znám, ale příkazy/roury mi přijdou čitelnější, když v nich data tečou zleva doprava.
Místní klasika: Tazatel se ptá na bash, ale respondenti místo toho vymýšlejí grep, sed, awk a kdovíco všechno ještě a pak to nakonec vyeskaluje do extrémů typu perl.
Trochu jako v politice, že jo…
key=300 # co má být před pomlčkou
while read line; do
if [[ "$line" = "$key"-* ]]; then
echo "${line#*-}"
break # jen první shoda (?)
fi
done < /cesta/k/tomu/souboru
Na tohle jsem taky myslel, ale nechtělo se mi s tím psát
Nicméně je dobré, že sem toto řešení píšeš.
Jinak ale PCRE neznamená, že by v tom nějak figuroval Perl – jsou to pouze regulární výrazy v syntaxi kompatibilní s těmi Perlovými.
$ type test test je součást shellu
$ whereis test test: /usr/bin/test /usr/share/man/man1/test.1.gz $ file /usr/bin/test /usr/bin/test: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=3de4ee302f56bd8e08a64b0d827e165750b3b65f, strippedAle asi jn.
Většinou ne.
Jedna hranatá závorka je v podstatě ekvivalent příkazu test. Existuje většinou /bin/[ Jako symlink na /bin/test. To je pro shelly starší / jednodušší než bash.
Bash má [ i test jako vestavěné příkazy, takže ani jednou hranatou závorkou se v bashi externí proces nespouští. (Jde to nějak podrobněji nastavit, ale nechce se mi to hledat.)
Dvě hranaté závorky jsou vestavěná záležitost v bashi — nemají už nic společného s příkazem test a umí toho mnohem víc než test. Mají rozšířenou syntaxi, dovedou matchovat vůči „extglobům“ atd. atp.
Jde to takhle:
$ type [ [ je součást shellu $ enable -n [ $ type [ [ je /usr/bin/[
nevím, jestli existuje ještě jiný způsob (tedy kromě překompilování Bashe bez podpory určitých příkazů).
Nebo by šel naopak implementovat jako vestavěný příkaz i ten cat (myslím, že je v příkladech ve zdrojácích Bashe). Pak by to byl prostě jen jiný zápis pro < a nespouštěl by se externí příkaz. BTW: ty vestavěné příkazy se dají načíst i dodatečně z knihovny – není potřeba překompilovávat celý Bash. Takže si člověk může dopisovat vlastní příkazy…
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.