Jak v textu označit jedno místo?

cat a.txt| grep " " 

nebo

cat a.txt| grep "\s " 

Komentáře

  • Bezplatné použití cat v obou případech. První by mohl být napsán grep ' ' a.txt, druhý podobně upravený.
  • Všimněte si, že \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].
  • pomocí gnu grep můžete omezit počet shod (-m) na jeden …
  • Toto je jednodušší egrep " \ s " a.txt

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.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *