grep меняет разделитель

12

В любом случае мы можем изменить разделитель, который использует grep?

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

StudioHack
источник
Это звучит так, как будто бы лучше подходит на SuperUser.com
Митч Демпси
Прочтите справочную страницу, посмотрите, есть ли такая опция (нет, я не верю, что есть).
Каскабель
Я уже прочитал это. и нет, нет выбора
@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;
че
источник
на самом деле, у меня есть такой набор данных, хранящийся внутри переменной: что-то ххххх гггггг @ ааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааау :аааааааааае, что это возможно: echo $ my_var | grep «что-то» это работает, но не так, как я хочу, grep принимает набор данных в одну строку, поэтому я хочу изменить его на определенный символ (здесь '@')
Тогда вы можете попытаться изложить это так:echo $my_var | tr @ '\n' | grep blahblah
че
Я сделал это, но, похоже, оболочка «пытается» выполнить содержимое: S
2
Вы должны процитировать переменный $my varдля сохранения белого-пространства и новой строки, то есть echo "$my_var" | ....
Mrucci
1

agrepиз Университета Аризоны позволяет установить разделитель. Это не замена замены для grep; он использует другой алгоритм (приблизительный 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
Kurt
источник
1
(1) Хотя это может решить проблему, мы предпочитаем, чтобы ответы имели немного больше объяснений. Например, есть ли реальная причина, чтобы сказать, d="${1}"а не просто d="$1"? (2) Вам нужно расширить свое предупреждение: если это используется с несколькими файлами, у вас также есть проблема, если любое из имен файлов содержит `@ '. (3) (Nit pick) Настоящая замена / эмулятор grep также будет работать с нулевыми аргументами файла.
Скотт
1

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

кошачий файл | tr '\ 00' '\ n' | grep "строка поиска"

Франц Мейер
источник
0

Как это ? Любое использование?

grep файл "search-string" | awk 'BEGIN {RS = "\ n"; ORS = "@"} {print}'

Установите «@» в соответствии с вашими потребностями.

user42723
источник