Portál AbcLinuxu, 15. května 2025 21:10
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:
sed
em 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.