греп змінює роздільник


12

будь-яким способом ми можемо змінити роздільник, який використовує grep?

Я думаю, за замовчуванням, греп використовує \nяк роздільник.


Це звучить так, як це краще підійде на SuperUser.com
Мітч Демпсі

Прочитайте сторінку man, перевірте, чи є такий варіант (ні, я не вірю, що існує).
Каскабель

Я вже її прочитав. і ні, немає варіанту

@jhon: Тоді не запитуйте, як змінити grep, а запитайте, як робити те, що ви хочете зробити з чимось іншим. Наприклад, ви можете вказати роздільник записів у perl ( $/) та awk ( RS). Або ви могли зробити щось на кшталт echo "$var" | sed 's/<delimiter>/\n/' | grep <pattern>. Багато відповідей, залежно від вашої реальної проблеми.
Каскабель

Відповіді:


2

Якщо ви дбаєте лише про вихід, він trможе працювати для вас:

che@nok ~ $ grep cpu /proc/cpuinfo | tr '\n' ';'
cpu family      : 6;cpu MHz             : 800.000;cpu cores     : 2;cpuid level : 10;cpu family : 6;cpu MHz : 800.000;cpu cores      : 2;cpuid level : 10;

насправді я маю такі дані, як такі, що зберігаються всередині змінної: щось xxxxx yyyyyy @ aaaaaaaaa bbbbb @ asdasd @ asdsda @ asds ... @ так, я здогадувався, чи можливо: echo $ my_var | grep "щось" це працює, але не так, як я хочу, grep приймає купу даних як єдиний рядок, тому я хочу змінити його на конкретний символ (ось "@")

Тоді ви можете спробувати поставити його як це:echo $my_var | tr @ '\n' | grep blahblah
Че

Я це зробив, але, схоже, оболонка "намагається" виконати вміст: S

2
Ви повинні процитувати змінну $my varдля збереження пробілів та нових рядків, тобто echo "$my_var" | ....
mrucci

1

agrepвід університету Арізони дозволяє встановити роздільник. Це не заміна заміни grep; він використовує інший алгоритм (приблизний греп, може збігатися з помилками) і має різний синтаксис шаблону. Але це зручний інструмент.

На жаль, я думаю, що через проблеми з ліцензуванням існувало декілька подібних проектів agrep, і вони не всі сумісні. Але я думаю, що всі версії дозволяють встановити роздільник.


1
case $# in
0|1|2)  cat >&2 <<EOF
    Usage: $0 delimiterstring pattern files....
    Behaves like grep -pdelimiterstring but on linux
    DOES NOT SUPPORT MOST ARGUMENTS
    unlike grep -p - leaves delimiterstring in output

    NO -p just the delimeterstring
    note: delimiterstring has to work in the sed command where the ${d} is
    if you are going to use @ in the delimeter string, then the @'s
    need to be replaced by someother character

EOF
    exit 0
;;
3)  mode=one ;;
*)  mode=many ;;
esac
d="${1}"
p="${2}"
shift 2
while [ $# -gt 1 ]
do
    sed "s@${d}@\x00@g" "${1}" | grep -z  "${p}" -  | (
        case $mode in 
        many) sed -e "s@\x00@${d}@g"  -e "s@^@${1}: @" ;;
        *)    sed -e "s@\x00@${d}@g"  ;;
        esac
    )
    shift
done

1
(1) Хоча це може вирішити проблему, ми віддаємо перевагу відповідям, щоб мати трохи більше пояснень. Наприклад, чи є реальна причина сказати d="${1}"замість просто d="$1"? (2) Вам потрібно розгорнути своє попередження: Якщо це використовується з декількома файлами, у вас також є проблема, якщо будь-яка назва файлів містить `@ '. (3) (Nit pick) Справжня заміна / емулятор «grep» також працюватиме з аргументами нульових файлів.
Скотт

1

Замініть нульовий роздільник ('@') на новий рядок (\ n) перед грепом:

файл котів | tr '\ 00' '\ n' | grep "рядок пошуку"


0

Як це? Будь-яке використання?

grep-файл "search-string" | awk 'ПОЧАК {RS = "\ n"; ORS = "@"} {print}'

Встановіть "@", що відповідає вашим потребам.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.