Префікс і суфіксні рядки до кожного вихідного рядка з команди


17

У мене виникли проблеми, намагаючись написати сценарій Bash. Коли grepвиводить, він повертає (як правило) багато рядків. Я хотів би встановити префікс і суфікс рядка до кожного з цих вихідних рядків.

Я також хотів би відзначити , що я ТРУБОПРОВІДНИЙ lsв grep, як:

ls | grep

2
Не варто розбиратись ls- це погано дзюджу. Також, чи має бути grep? І чи можете ви навести приклад?
Sobrique

1
Що ви хочете, щоб ваш сценарій робив, якщо ім'я файлу містить новий рядок?
Tai Viinikka

Відповіді:


27

З sed:

ls | grep txt | sed 's/.*/prefix&suffix/'

3
Або, sedбудучи grepls | sed -n '/txt/s/.*/prefix&suffix/p'ls | sed -n 's/.*txt.*/prefix&suffix/p'
суперсетью

@ StéphaneChazelas: Дякую за цей натяк.
Кіра

5

З sed:

ls | grep pattern | sed -e 's/^/prefix/' -e 's/$/suffix/'

Але зауважте, це страждає від проблем з назви файлів з каналами рядків, і всі різні проблеми розбору, lsякі, як правило, є поганою ідеєю.

З перл

perl -e 'print "prefix".$_."suffix\n" for grep { m/somepattern/} glob "*"'

Примітка - perl grepможе приймати зразок - як grepкоманда, але ви також можете робити такі речі, як застосувати тести файлів.

Напр

grep {-d} glob "*" #filters directories.
grep { (stat)[9] > time() - 60 } glob "*" #reads file mtime and compares. 

У межах grepітератора за замовчуванням $_встановлено поточне значення елемента, тому ви можете застосувати sed/ grepстилю регулярного вираження або виконувати різні завдання на основі $_.


Як би я включив змінну як суфікс / префікс у свій перший приклад, використовуючи ´sed´?
SpecialBomb

Змініть лапки і просто використовуйте їх.
Sobrique

2

У цьому випадку GNU findдозволяє вам робити всі ці речі за один раз, виключаючи труби та потенційно проблемний аналіз ls:

find . -maxdepth 1 -name '[^.]*' \
  -regextype posix-extended -regex "MYPATTERN" \
  -printf 'SOMEPREFIX %f SOMESUFFIX\n'

( findзвичайно, це не гарний спосіб довільно змінити вихід інших команд!)

Деякі примітки:

  • -maxdepth 1і -name [^.]*зробити роботу зі збігом імен таким же, як і звичайну ls(або ls .). Ви можете використовувати будь-який глобус у стилі оболонки, але зауважте, що "*" відповідатиме провідному ". в імені на відміну від bashцього, [^.]*означає все, що не має провідного "".
  • MYPATTERN - це власний POSIX ERE (тип за замовчуванням - Emacs, дивіться тут ), але він повинен відповідати всьому імені файлу, тому використовуйте щось на зразок .*thing.*замість простоthing
  • ви, ймовірно, можете просто використовувати один з -name/ -regexзамість обох (наприклад, -regex "[^.]. MYPATTERN. "
  • -printfпідтримує багато речей , %nце ім'я файлу чи каталогу без відбитків

(це може залежати від вашої версії, findхоча, перевірте розділ «СТАНДАРТНІ КОНФОРМЕНЦІЇ» на вашій сторінці чоловіка)

В якості можливої альтернативи без будь - яких зовнішніх програм , необхідних, bashє , compgenякі, крім усього іншого, розширює кульки, що еквівалентно lsбез опцій:

compgen -P "someprefix>" -S "<somesuffix" -G "pattern"

Це обробляє назви файлів з пробілом, включаючи нові рядки. compgen -G "*"має забезпечити такий же вихід, як і звичайний ls(але зауважте, що ls *це зовсім інша річ). Вам все одно знадобиться grep, і це може чи не вирішить проблему, але це варто згадати.


0

sedі findрішення оскаржуються , якщо ваш префікс / суфікс включають регулярне вираз ключових символів або , якщо хочете передати змінну оточення (замість безпосереднє значення), xargs+ echoможе бути більш підходящим тут.

З змінною середовища:

ls | grep p | xargs -I % sh -c "echo $PATH/%"

З вбудованим рядком:

ls | grep p | xargs -I % sh -c "echo `pwd`/%"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.