bash在每行文件中搜索字符串,排除一些具有相同结构的行和cpy

时间:2014-01-06 07:56:56

标签: bash shell

i've got this file pattern 

#### data  ###
#### roles ###
11 test test22 
12 hash  hash2
13 hash3   hash77
14 hash5 ahss
14 hash5 ahss
14 hash2 adfasf
14 hash7 asfdf

#### data  ###
#### addding ###
11 test test22 
12 hash  hash2
13 hash3   hash77
14 hash5 ahss
14 hash5 ahss
14 hash2 adfasf
14 hash7 asfdf

我想只复制行启动wuth 14并排除所有其他行到输出文件,输出文件应该是相同的结构,比如

#### data  ###
#### roles ###

14 hash5 ahss
14 hash5 ahss
14 hash2 adfasf
14 hash7 asfdf

#### data  ###
#### addding ###

14 hash5 ahss
14 hash5 ahss
14 hash2 adfasf
14 hash7 asfdf

我使用grep但它不会复制文件的标题   #### data ###     #### roles ###

使用while循环或

进行任何操作

3 个答案:

答案 0 :(得分:1)

grep -E -e '^(#|$|14 )' data.file

这会复制以#开头的行,空白行以及以14开头的行和空白行。

grep -E相当于egrep

egrep -e '^(#|$|14 )' data.file

您也可以使用sedawk(或Perl或Python)执行此操作,但这些操作比必要的更复杂。

答案 1 :(得分:1)

您可以使用grep -E,因为它允许匹配替代方案:

grep -E '^#|^14 |^$' infile > outfile

答案 2 :(得分:0)

在bash脚本中,将数据保存在data.txt中并调用脚本

#!/bin/bash
while read line
do
  ret=0;
  echo $line | grep -q "^[0-9]\+\s\+[a-zA-Z0-9]\+\s\+.[a-zA-Z0-9]\+"
  ret=$?
  if [ $ret -eq 0 ]; then
    echo $line | grep "^14 "
  else
    echo $line;
  fi;
done < data.txt