Pokud to chcete udělat a odstranit mezery, které potřebujete:
echo -n "Hello" | od -A n -t x1 | sed 's/ *//g'
První dva příkazy v potrubí dobře vysvětluje @TMS ve své odpovědi, jak je upravil @James. Poslední příkaz se liší od komentáře @TMS tím, že je správný a zároveň byl testován. Vysvětlení je:
sed
je s tream ed itor.s
je s náhradní příkaz./
otevře regulární výraz - lze použít libovolný znak./
je konvenční, ale nepohodlné pro zpracování, řekněme, XML nebo názvů cest./
nebo alternativní znak, který jste vybrali, zavře regulární výraz a otevře substituční řetězec.- V
/ */
*
odpovídá libovolné sekvenci předchozího znaku (v tomto případě mezery). /
nebo alternativní znak, který jste vybrali, zavře substituční řetězec. V tomto případě substituční řetězec//
je prázdný, tj. shoda je smazána.g
je možnost provést toto nahrazení g lobálně na každém řádku namísto pouze jednou pro každý řádek.- Uvozovky zabraňují zmatení analyzátoru příkazů – celá sekvence je předána do
sed
jako první možnost, konkrétněsed
skript.
@TMS mozek dítě (sed 's/^ *//'
) pouze odděluje mezery od začátku každého řádku (^
odpovídá začátku řádku - 'pattern space' v sed
-mluvte).
Pokud chcete navíc odstranit nové řádky, nejjednodušším způsobem je přidat
| tr -d '\n'
do příkazových rour. Funguje následovně:
|
přivede dříve zpracovaný proud na standardní vstup tohoto příkazu.tr
je tr příkaz anslate.-d
určuje odstranění odpovídajících znaků.- V uvozovkách jsou uvedeny vaše odpovídající znaky – v tomto případě pouze nový řádek (
\n
).Translate odpovídá pouze jednotlivým znakům, nikoli sekvencím.
sed
je jedinečně retardovaný při práci s novými řádky. Důvodem je sed
je jedním z nejstarších unix
příkazy - bylo vytvořeno dříve, než lidé skutečně věděli, co dělají. Všudypřítomný starší software brání tomu, aby byl opraven. Vím to, protože jsem se narodil před unix
se narodil.
Historickým původem problému byla myšlenka, že nový řádek je oddělovač řádků, nikoli část řádku. Proto byl odstraněn linkovými zpracovatelskými společnostmi a znovu vložen výstupními společnostmi. Problém je v tom, že to vytváří předpoklady o struktuře uživatelských dat a ukládá nepřirozená omezení v mnoha nastaveních. sed
Neschopnost snadno odstranit nové řádky je jedním z nejběžnějších příkladů nesprávné ideologie způsobující smutek.
Nové řádky je možné odstranit pomocí sed
- jde jen o to, že všechna řešení, o kterých vím, tvoří sed
zpracovat celý soubor najednou, což u velmi velkých souborů škrtí, což maří účel streamového editoru. Jakékoli řešení, které si zachovává řádkové zpracování, pokud je to možné, by bylo nečitelným krysím hnízdem z více potrubí.
Pokud trváte na použití sed
zkuste:
sed -z 's/\n//g'
-z
říká sed
k použití nul jako oddělovačů řádků.
Interně, řetězec v C
je ukončena nulou. -z
volba je také výsledkem starší verze, která je poskytována jako pohodlí pro C
programátoři, kteří by mohli chtít použít dočasný soubor vyplněný C
-řetězce a nepřehledné novými řádky. Mohou pak snadno číst a zpracovávat jeden řetězec najednou. Opět platí, že první předpoklady o případech použití ukládají uživatelská data umělá omezení.
Pokud vynecháte g
Tento příkaz odstraní pouze první nový řádek. Pomocí -z
možnost sed
interpretuje celý soubor jako jeden řádek (pokud v souboru nejsou vnořeny bludné nuly), ukončený nulou, a tak to také dusí velké soubory.
Možná si myslíte
sed 's/^/\x00/' | sed -z 's/\n//' | sed 's/\x00//'
Mělo by to fungovat. První příkaz vloží nulu na začátek každého řádku na základě řádku po řádku, což vede k \n\x00
končí každý řádek. Druhý příkaz odstraní z každého řádku jeden nový řádek, nyní oddělený nulami - na základě prvního příkazu bude pouze jeden nový řádek. Vše, co zbylo, jsou falešné nuly. Zatím je vše dobré. Zlomená myšlenka je, že roura bude podávat poslední příkaz řádek po řádku, protože tak byl stream vytvořen. Ve skutečnosti poslední příkaz, tak jak byl napsán, odstraní pouze jednu hodnotu null, protože nyní celý soubor nemá žádné nové řádky a je tedy jeden řádek.
Jednoduchá implementace kanálu používá přechodný dočasný soubor a veškerý vstup je zpracován a přiváděn do souboru. Další příkaz může být spuštěn v jiném vlákně a současně číst tento soubor, ale vidí pouze proud jako celek (i když neúplný) a nemá žádné povědomí o hranicích chunků, které soubor dodávají. I když je roura vyrovnávací pamětí, další příkaz vidí proud jako celek. Vada je neodmyslitelně zapečena do sed
.
Aby tento přístup fungoval, potřebujete g
možnost na posledním příkazu, takže opět škrtí velké soubory.
Pointa je následující:nepoužívejte sed
ke zpracování nových řádků.
echo hello | hexdump -v -e '/1 "%02X "'
echo -n "Hello" | od -A n -t x1
Vysvětlení:
echo
program poskytne řetězec dalšímu příkazu.-n
flag říká echo, aby negenerovalo nový řádek na konci "Ahoj".od
program je program "osmičkového výpisu". (Poskytneme příznak, který mu řekne, aby jej vypisoval v šestnáctkové soustavě místo v osmičkové soustavě.)-A n
flag je zkratka pro--address-radix=n
, přičemž n je zkratka pro "none". Bez této části by příkaz vypsal ošklivou číselnou předponu adresy na levé straně. To je užitečné pro velké skládky, ale pro krátký řetězec je to zbytečné.-t x1
flag je zkratka pro--format=x1
, přičemž x je zkratka pro "hexadecimální" a 1 znamená 1 bajt.