temp
fájlom van, kis- és nagybetűs tartalommal.
Bevitel
A temp
fájlom tartalma:
hi Jigar GANDHI jiga
Az összes felsőt alacsonyabbá akarom alakítani .
Parancs
Kipróbáltam a következő parancsot:
sed -e "s/[A-Z]/[a-z]/g" temp
de rossz a kimenet.
Output
A következőképpen szeretném:
hi jigar gandhi jiga
Mi kell a helyettesítő részben sed
argumentum argumentuma?
Megjegyzések
- Lásd még: Hogyan lehet átalakítani az UTF-8 txt fájlokat a bash összes nagybetűjére?
Válasz
Ha a bemenet csak ASCII karaktereket tartalmaz, használhatja a következőt: tr
, például:
vagy (kevésbé könnyen megjegyezhető és beírható IMO; de nem korlátozódva az ASCII latin betűkre, bár egyes megvalósításokban, beleértve a GNU tr
, továbbra is csak egy bájtos karakterekre korlátozódnak, így az UTF-8 területi beállításokban továbbra is csak az ASCII betűkre korlátozódnak):
tr "[:upper:]" "[:lower:]" < input
ha a sed
-t kell használnia:
sed "s/.*/\L&/g" < input
(itt a GNU megvalósítását feltételezve).
A POSIX sed
használatával meg kell adnia az összes átírást, és akkor kiválaszthatja, hogy melyik konvertálni kívánt betűk:
sed "y/AǼBCΓDEFGH.../aǽbcγdefgh.../" < input
A következővel: awk
:
awk "{print tolower($0)}" < input
Megjegyzések
- Felhívjuk figyelmét, hogy az
\L
egy GNU kiterjesztés. -
\L
eddig jól működik számomra. Világítson rá arra a pontra, hogy GNU kiterjesztést szeretne csinálni - @JigarGandhi.
sed
egy Unix parancs. A különböző rendszereknek különböző változatai vannak, eltérő viselkedéssel és d funkcionalitás. Szerencsére manapság ‘ van egy szabvány, amely a legjobban megfelel, így számíthat a mindenki számára közös jellemzők minimumára.\L
nincs köztük, és a GNU vezette be div> /vi
), és más megvalósításokban általában nem érhető el. - Ne feledje, hogy néhány
tr
megvalósítás, például a GNUtr
ne ‘ ne működjön megfelelően a több bájtos nyelvterületeken (ezek nagy része manapság már meg is van, próbálja meg aecho STÉPHANE | tr '[:upper:]' '[:lower:]'
például). GNU rendszereken előnyben részesítheti ased
változatot vagy aawk
‘ stolower()
. - Enyhe javítás:
sed 's/.*/\L&/g' < input
. A\1
megfeleltetett alrészre történő hivatkozás akkor fog működni, ha ‘ t működni fog, hacsak nem adja meg zárójelekkel az alsztringet, mint a wurtle az övében. Azonban ‘ enyhén tisztább, ha a&
-t használja az egész mérkőzés képviseletére, amint az
Válasz
A vim használatával nagyon egyszerű:
$ vim filename gg0guGZZ
Megnyílik a fájl, gg
az első sorhoz megy, 0
, az első oszlophoz. guG
, csökkenti az összes karakter kis- és nagybetûjét a fájl aljáig. ZZ
elment és kilép.
Csaknem mindent kezelnie kell, amit eldob; “Figyelmen kívül hagyom a számokat, ez nem ASCII-t fog kezelni.
Ha az ellenkezőjét akarta tenni, akkor az alsó betűket nagybetűvé alakítsa, cserélje le a u
ki a U
: gg0gUGZZ
és beállítottad.
Megjegyzések
- Lol ” szuper egyszerű ”
- ez nyilvánvalóan nem ‘ t skálázza sok fájlt
- @CoreyGoldberg
vim file1 file2 fileetc
, majd valami:bufdo gg0guG:w<CR>
valószínűleg valószínűleg tetszőleges számú fájlhoz használható. Még nem tesztelted ezt! - @TankorSmash, amely még mindig nem ‘ t skálázza nagy fájlszámra
Válasz
Nekem tetszik dd
.
<<\IN LC_ALL=C 2<>/dev/null \ dd conv=lcase hi Jigar GANDHI jiga IN
… kap …
hi jigar ghandi jiga
A LC_ALL=C
a bemenetben lévő több bájt védelmét szolgálja, bár a több bájtos nagybetűk nem lesznek átalakítva. Ugyanez vonatkozik a (GNU) tr
-re is – mindkét alkalmazás hajlamos a nem C nyelvű terjesztésbe belevágni. A iconv
bármelyikkel kombinálható az átfogó megoldás érdekében.
A 2>/dev/null
átirányítás elveti az dd
“alapértelmezett állapotjelentést – és annak stderr-jét. Enélkül dd
egy olyan munka befejezését követné, mint a fenti, és információkat nyomtatna, például hány bájt feldolgozásra került stb.
Megjegyzések
- Ez a megoldás sokkal gyorsabb, mint a
tr
, ha nagy fájlokat kezel, köszönöm!
Válasz
Használhatja a Perl 5-et is:
perl -pe "$_=lc" temp
A -p
opció megmondja perl a megadott kifejezés egyszeri futtatásához minden bemeneti sornál, kinyomtatva az eredményt, vagyis a $_
végső értékét. -e
azt jelzi, hogy a program lesz a következő argumentum, szemben a szkriptet tartalmazó fájllal. Az lc
kisbetűvé konvertál. Argumentum nélkül a $_
. És $_=
ezt újra elmenti, így kinyomtatja.
Ennek egy változata a következő lenne:
perl -ne "print lc" temp
A -n
olyan, mint a -p
, kivéve, hogy a végén $_
nem nyomtatják ki. Tehát ahelyett, hogy ebbe a változóba mentenék, egy explicit nyomtatási utasítást is felveszek.
A Perl egyik előnye a seddel szemben, hogy nincs szüksége GNU kiterjesztésre. Vannak olyan projektek, amelyeknek kompatibilisnek kell lenniük a nem GNU környezetekkel, de amelyek már függenek Perl-től is. A tr
-hez képest előfordulhat, hogy Perl lc
könnyebben tájékozódhat. A részletekért lásd a perllocale
man oldalt.
Válasz
Rögzítenie kell a hozzáillő mintát, majd módosítóval cserélje ki:
sed "s/\([A-Z]\)/\L\1/g" temp
A \(...\)
“rögzíti” a mellékelve az egyező szöveget, az első elfogás az \1
, a következő a \2
stb. mellé kerül. A számozás a nyitó zárójelek szerint történik beágyazott rögzítések.
A \L
a rögzített mintát kisbetűvé konvertálja, nagybetűs \U
is .
Megjegyzések
- ezt nem kell tennie – az egész minta mindig a
&
- Igaz, de akkor kihagytam volna a lehetőséget, hogy elmagyarázzam a mérkőzések rögzítését 🙂
Válasz
Az MvG válasza mellett használhatja a Perl 6-ot is:
perl6 -pe .=lc temp
Itt a $ _ implicit, és nem kellenek egyetlen idézőjelek, hogy megvédjék a héj általi kiterjesztéstől (a $ _ egy speciális Bash paraméter; lásd: https://www.gnu.org/software/bash/manual/html_node/Special-Parameters.html )