在UNIX中grep一个选项卡

Sac*_*iya 399 unix grep

如何grep在Unix平台上的文件中选项卡(\ t)?

unw*_*ind 362

如果使用GNU grep,您可以使用Perl样式的正则表达式:

grep -P '\t' *
Run Code Online (Sandbox Code Playgroud)

  • @rook GNU不是UNIX. (20认同)
  • 在Mac OSX中,您可以使用-e给出模式 (5认同)
  • @futureelite:根据Apple的文档(http://developer.apple.com/Mac/library/documentation/Darwin/Reference/ManPages/man1/grep.1.html),Mac OS X grep程序应该支持-P选项.考虑在superuser.com上创建一个新问题. (2认同)
  • 这对GNU UNIX非常有用,但是POSIX Solaris,AIX和HP-UX呢?那些对'-P`选项一无所知. (2认同)

ant*_*rov 301

诀窍是在引号前使用$ sign .它也适用于切割和其他工具.

grep $'\t' sample.txt
Run Code Online (Sandbox Code Playgroud)

  • http://www.gnu.org/software/bash/manual/bashref.html#ANSI_002dC-Quoting (15认同)
  • Lifesavior提示拯救生命!据我所知,它也适用于`zsh`.你能否评论一下`$`符号的语义是什么? (7认同)
  • 拉曼:你可以用'$'\ t'''`.一个真实的例子显示它也适用于sh(不仅是bash,默认情况下不安装在Android上)是`busybox grep -oE'^ nodev'$'\ t''fuse $'/ proc/filesystems`. (6认同)
  • 我认为$'......'是一种bash成语.可能在sh中不起作用.关于csh或tcsh的Dunno. (5认同)
  • 如果字符串包含除 '\t' 以外的任何内容,则不起作用。例如,您将如何搜索“\t”(制表符+空格)? (3认同)
  • 源自“ man bash”:特别对待$'string'形式的单词。该单词扩展为字符串,并按ANSI C标准的规定替换反斜杠转义字符。反斜杠转义序列(如果存在)将被解码... (3认同)
  • @Raman 它也适用于普通字母,例如`zgrep $'\tPara\t' *` - 通过 Ubuntu 14 bash 找到被标签包围的“Para” (2认同)

Sam*_*amK 83

我从来没有设法让'\ t'元字符与grep一起工作.但是我发现了两种替代解决方案

  1. 使用<Ctrl-V> <TAB>(按Ctrl-V然后键入tab)
  2. 使用awk: foo | awk '/\t/'

  • 便携式POSIX解决方案+1,不使用bashisms,zshism,GNUism和linuxism. (6认同)
  • `| awk'/\t /'`解决方案适用于所有shell,平台和系统. (4认同)
  • 如果您想复制粘贴(从您的笔记或脚本),ctrl-V 没有用。更好地使用具有可见的 '\t' 的显式解决方案,文字标签(即看起来像空格的标签)通常在复制粘贴时转换为 SPC ... (2认同)

Poo*_*Poo 43

从Ask Ubuntu上的这个答案:

告诉grep使用Perl定义的正则表达式(Perl有 \tas选项卡):

grep -P "\t" <file name>
Run Code Online (Sandbox Code Playgroud)

使用文字制表符:

grep "^V<tab>" <filename>
Run Code Online (Sandbox Code Playgroud)

使用printf打印制表符给你:

grep "$(printf '\t')" <filename>
Run Code Online (Sandbox Code Playgroud)


tjm*_*ore 30

一种方法是(这是与Bash)

grep -P '\t'
Run Code Online (Sandbox Code Playgroud)

-P 打开Perl正则表达式,因此\ t将起作用.

正如用户放松所说,它可能是特定于GNU grep.如果shell,编辑器或终端允许,可以选择在其中插入一个选项卡.

  • -P是特定于grep的,而不是任何shell的。-P应该可以在任何外壳中工作,只要已安装GNU grep (2认同)

Alo*_*dal 11

在表达式中字面插入选项卡的另一种方法是使用$'\t'Bash中鲜为人知的引用:

grep $'foo\tbar'        # matches eg. 'foo<tab>bar'
Run Code Online (Sandbox Code Playgroud)

(请注意,如果您匹配固定字符串,则可以使用'-F'模式.)

有时使用变量可以使符号更具可读性和可管理性:

tab=$'\t'               # `tab=$(printf '\t')` in POSIX
id='[[:digit:]]\+'
name='[[:alpha:]_][[:alnum:]_-]*'
grep "$name$tab$id"     # matches eg. `bob2<tab>323`
Run Code Online (Sandbox Code Playgroud)

  • 这是一种羞辱。下面使用 echo 或 printf 的答案是可移植的。 (2认同)

小智 10

这不是您正在寻找的,但可能适用于您的情况

grep '[[:blank:]]'
Run Code Online (Sandbox Code Playgroud)

相当于

grep -P '[ \t]'
Run Code Online (Sandbox Code Playgroud)

所以它会找到Space和Tab.

§角色类

请注意,它不是在我的广告man grep,但仍然有效

$ man grep | grep blank | wc
      0       0       0


van*_*joe 6

使用echo为您插入选项卡 grep "$(echo -e \\t)"


小智 6

基本上有两种解决方法:

  1. (推荐)使用grep(1)支持的正则表达式语法.现代grep(1)支持两种形式的POSIX 1003.2正则表达式语法:基本(过时)RE和现代 RE.语法在re_format(7)和regex(7)手册页中有详细描述,它们分别是BSD和Linux系统的一部分.GNU grep(1)还支持pcre(3)库提供的Perl兼容RE.

    在正则表达式语言中,制表符号通常由\tatom 编码.的原子被BSD扩展正则表达式的支持(egrep,grep -E在BSD兼容系统),以及Perl兼容的RE(pcregrep,GNU grep -P).

    基本正则表达式和Linux扩展RE显然都不支持\t.请参考UNIX实用程序手册页以了解它支持哪种正则表达式语言(因此sed(1),awk(1)和pcregrep(1)正则表达式之间的区别).

    因此,在Linux上:

    $ grep -P '\t' FILE ...
    
    Run Code Online (Sandbox Code Playgroud)

    在BSD一样的系统:

    $ egrep '\t' FILE ...
    $ grep -E '\t' FILE ...
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将制表符转换为模式.编辑脚本文件时这很简单:

    # no tabs for Python please!
    grep -q '   ' *.py && exit 1
    
    Run Code Online (Sandbox Code Playgroud)

    但是,在交互式shell中工作时,您可能需要依赖shell和终端功能在行中键入正确的符号.在大多数终端上,这可以通过Ctrl+ V组合来完成,它指示终端按字面意思处理下一个输入字符(V用于"逐字"):

    $ grep '<Ctrl>+<V><TAB>' FILE ...
    
    Run Code Online (Sandbox Code Playgroud)

    某些shell可能为命令排版提供高级支持.这样,在bash(1)中,表格的字$'string'是特别对待的:

    bash$ grep $'\t' FILE ...
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,虽然在命令行中很好,但是当脚本移动到另一个平台时,这可能会产生兼容性问题.另外,使用特价时请注意引号,详情请咨询bash(1).

    对于Bourne shell(并且不仅仅是),可以使用printf(1)增强的命令替换来模拟相同的行为,以构造正确的正则表达式:

    $ grep "`printf '\t'`" FILE ...
    
    Run Code Online (Sandbox Code Playgroud)


小智 5

A good choice is to use sed.

sed -n '/\t/p' file
Run Code Online (Sandbox Code Playgroud)

Examples (works in bash, sh, ksh, csh,..):

[~]$ cat testfile
12 3
1 4 abc
xa      c
        a       c\2
1 23
Run Code Online (Sandbox Code Playgroud)
[~]$ sed -n '/\t/p' testfile 
xa      c
        a       c\2
[~]$ sed -n '/\ta\t/p' testfile
        a       c\2
Run Code Online (Sandbox Code Playgroud)

(This answer has been edited following suggestions in comments. Thank you all)


kum*_*303 5

grep "$(printf '\t')"在 Mac OS X 上为我工作