grep更改定界符


12

我们可以通过任何方式更改使用grep的定界符吗?

我认为,默认情况下,grep \n用作分隔符。


听起来更适合SuperUser.com
Mitch Dempsey,2010年

阅读手册页,看看是否有这样的选择(不,我不相信有)。
卡斯卡贝尔

我已经看过了。而且没有,没有选择

@jhon:然后不要问如何更改grep,不要问如何用其他方法去做。例如,您可以在perl($/)和awk(RS)中指定记录分隔符。或者你可以做类似的事情echo "$var" | sed 's/<delimiter>/\n/' | grep <pattern>。许多答案,取决于您的实际问题是什么。
卡斯卡贝尔

Answers:


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;

实际上,我有大量这样的数据,存储在一个变量中:xxxxxx 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的替代品;它使用不同的算法(近似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选择)真正的“ grep”替换/仿真器也可以使用零文件参数。
斯科特

1

在grep之前用换行符(\ n)替换零分隔符('@'):

猫文件| tr'\ 00''\ n'| grep“搜索字符串”


0

这个怎么样 ?有什么用吗?

grep文件“搜索字符串” | awk'BEGIN {RS =“ \ n”; ORS =“ @”} {print}'

将“ @”设置为适合您需要的任何值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.