我正在寻找一个shell脚本,它使用grep从文件中获取行号,并使用这些行号作为sed命令的head和tail来剪切文件。
我的脚本看起来像这样:
head=$(grep -n -i -B 1 "^\s\+abcd" <sourcefilename> | head -n 1 | cut -d: -f1)
tail=$(grep -n -i -B 1 " efgh" <sourcefilename> | tail -n 1| cut -d: -f1)
if($head!=NULL)
then
sed -n "$head,$tailp" <sourcefile>.txt > <newfile>.txt
fi
我的目标是使用第一个grep,并在匹配模式时获取头行号,然后使用第二个grep获取与模式匹配的尾行号,并使用它们作为sed的输入 - n切换并创建一个只有从头到尾的行号的文件。
如果我对文件单独执行,比如
grep -n -i "^\s\+abcd" <filename> | head -n 1 | cut -d: -f1 , it gives me 11 and
grep -n -i " efgh" <filename> | tail -n 1| cut -d: -f1 gives me 106.
然后我使用这些数字作为输入并执行
sed -n 11,106 <sourcefile>.txt > <newfile>.txt
它完美无缺。我正在尝试自动化该过程,以便拥有一个可以同时针对多个文件运行的脚本。
另外,带有NULL的if语句意味着当grep没有返回任何内容时,只是不要运行循环,这似乎也是错误的。
答案 0 :(得分:0)
你可以用awk解决这个问题。首先是一些数据:
$ cat file
1
2
3
4
5
$ awk '/2/,/4/' file
2
3
4
您可以使用正确的头部和尾部regexen替换2
和4
。
修改:grep -B 1
的一个例子:
$ awk '/2/{f=1;print p} f{print} /4/{f=""} {p=$0}' file
1
2
3
4
答案 1 :(得分:0)
您不需要grep来搜索模式,您只能使用sed或awk:
sed -nE '/^\s+abcd/,/ efgh/p' sourcefile.txt
或
awk '/^\s+abcd/,/ efgh/{print}' sourcefile.txt
或更简单(默认情况下awk只是打印行)
awk '/^\s+abcd/,/ efgh/' sourcefile.txt
/pattern1/,/pattern2/{commands}
对于sed和awk来说与/ pattern1 /和/ pattern2 /之间的行一起使用是很常见的。
在您的情况下,您只需打印输出。
答案 2 :(得分:0)
sed -n“ $ linenum,\ $ p” $ infile >> source.csv
这对于示例数据实际上对我有用。它使我从文件的头到尾都行了。