A fájl tartalmának konvertálása kisbetűs

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

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 GNU tr 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 a echo STÉPHANE | tr '[:upper:]' '[:lower:]' például). GNU rendszereken előnyben részesítheti a sed változatot vagy a awk ‘ s tolower().
  • 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 )

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük