Wystąpił problem podczas próby napisania skryptu Bash. Kiedy grep
wyświetla, zwraca (zwykle) wiele wierszy. Chciałbym przedrostek i przyrostek do każdego z tych wierszy wyjściowych.
Chciałbym również zauważyć, że jestem potokiem ls
się grep
, jak:
ls | grep
bash
shell-script
grep
SpecialBomb
źródło
źródło
ls
- to złe juju. Czy to musi byćgrep
? Czy możesz podać przykładowy wynik?Odpowiedzi:
Z sed:
źródło
sed
będąc nadzbioremgrep
:ls | sed -n '/txt/s/.*/prefix&suffix/p'
lubls | sed -n 's/.*txt.*/prefix&suffix/p'
Z
sed
:Ale zauważ, że cierpi to z powodu problemów z nazwami plików z liniami i wszystkimi innymi problemami z parsowaniem,
ls
co jest ogólnie złym pomysłem.Z perlem
Uwaga - perl
grep
może przyjmować wzorzec - jakgrep
polecenie, ale możesz także wykonywać testy plików.Na przykład
W
grep
domyślnym iteratorze$_
ustawiana jest bieżąca wartość elementu, dzięki czemu można zastosowaćsed
/grep
styl wyrażenia regularnego lub wykonać różne zadania w oparciu o$_
.źródło
“
i po prostu użyj ich.W tym przypadku GNU
find
pozwala robić wszystkie te rzeczy za jednym razem, eliminując potoki i potencjalnie kłopotliwe analizowaniels
:(
find
oczywiście nie jest to dobry sposób na dowolną modyfikację wyników innych poleceń!)Niektóre uwagi:
-maxdepth 1
i-name [^.]*
spraw, aby dopasowywanie nazw działało tak samo jak zwykłyls
(lubls .
). Możesz użyć dowolnego globu w stylu powłoki, ale zauważ, że „*” będzie pasować do wiodącego „.” w nazwie † w przeciwieństwie dobash
, więc[^.]*
oznacza wszystko, co nie ma wiodącego „.”.*thing.*
zamiastthing
-name
/-regex
zamiast obu (np. -regex "[^.]. MYPATTERN. "-printf
obsługuje wiele rzeczy ,%n
jest bez ozdób nazwa pliku lub kataloguJako możliwą alternatywę bez żadnych zewnętrznych programów wymaganych,
bash
macompgen
które, między innymi, rozszerza globs, równoważnals
bez opcji:To obsługuje nazwy plików z białymi znakami, w tym znaki nowej linii.
compgen -G "*"
powinien zapewniać takie same wyniki jak zwykłyls
(ale należy pamiętać, żels *
jest to zupełnie inna rzecz). Nadal będziesz potrzebowaćgrep
, a to może rozwiązać problem, ale warto o nim wspomnieć.źródło
sed
afind
rozwiązania są kwestionowane, jeśli prefiks / sufiks zawierają znaki wyrażenia regularnego lub jeśli chcesz przekazać zmienną środowiskową (zamiast bezpośredniej wartości),xargs
+echo
może być bardziej odpowiednie tutaj.Ze zmienną środowiskową:
Z wbudowanym:
źródło