Jak v textu označit jedno místo?
cat a.txt| grep " "
nebo
cat a.txt| grep "\s "
Komentáře
Odpověď
Pokud chcete grep pouze pro jedno místo, jak jste vložili do své otázky, použili byste něco jako:
grep -e "^\s[^\s]" -e "[^\s]\s$" -e "[^\s]\s[^\s]" a.txt
nebo pro varianty POSIX:
grep -e "^ [^ ]" -e "[^ ] $" -e "[^ ] [^ ]" a.txt
nebo méně čitelná varianta POSIX:
grep "\(^\|[^ ]\)\ \([^ ]\|$)" a.txt
Za předpokladu, že chcete vyloučit řádky, které obsahují více než jeden sousední prostor , toto výslovně vyžaduje, aby existoval jeden prostor, kterému nebude předcházet mezera a nebude následovat mezera.
Rovněž stojí za zmínku, že ne všechny verze grep podporují regulární výrazy.
Komentáře
- Všechna poslední zpětná lomítka z posledního příkladu můžete vynechat a zlepšit čitelnost pomocí možnosti
-E
specifikované POSIXem, která umožňuje rozšířené regulární výrazy.grep -E '(^|[^ ]) ([^ ]|$)' a.txt
V každém případě zpětné lomítko před mezerou není potřeba ' a před závěrečnou závorkou ' chybí. u verzígrep
, které rozumějí\s
, můžete zkrátit výraz pro neprostor[^\s]
to\S
- Toto však také funguje, [[: blank:]]
odpověď
Myslím, že jsem to našel:
grep "\+[[:space:]]\+" a.xml
Odpovědět
Varianta 2 najde pouze dvě mezery. Pokud použijete "\s"
místo toho budou fungovat obě varianty.
Toto byste mohli snadno otestovat, tak jaká je vaše skutečná otázka?
Komentáře
- Proč najít pouze dvě mezery? Myslím, že odpovídá jakémukoli prostoru.
- @Gnouc: Varianta 2, jak ji píše
'\s '
bude odpovídat alespoň dvěma mezerám v řadě, protože přidal mezeru znak za skupinou znaků\s
. - Máte ' pravdu, nemám ' nevidím mezeru po
\s
, moje chyba.
cat
v obou případech. První by mohl být napsángrep ' ' a.txt
, druhý podobně upravený.\s
odpovídá také kartě, návrat, svislá karta, podávání formulářů a technicky nový řádek. Pokud chcete spojit pouze mezeru a kartu, použijte[[:blank:]]
nebo[ \t]
.-m
) na jeden …