如何从文件中grep和删除分隔符

时间:2016-11-03 21:59:32

标签: bash shell scripting sh

我有一个看起来像这样的文件:

===SEPARATOR===
line2
line3
===SEPARATOR===
line5
line6
===SEPARATOR===
line8
...
lineX
===SEPARATOR===

如何执行while循环并浏览文件,将两个===SEPARATOR===次出现之间的任何内容转储到另一个文件中以进行进一步处理? 我想在第一次迭代时只将line2,line3添加到第二个文件。我会解析文件;在下一次迭代中,我希望第二个文件中的line5 line6再次对不同的数据进行相同的解析。

5 个答案:

答案 0 :(得分:1)

您可以将===SEPARATOR===grep -v匹配的所有行排除,并将其余行重定向到文件:

grep -vx '===SEPARATOR===' file > file_processed

-x确保只排除完全匹配===SEPARATOR===的行。

答案 1 :(得分:1)

这使用sed查找分隔符之间的行,然后使用grep -v删除分隔符。

$ sed -n '/===SEPARATOR===/,/===SEPARATOR===/ p' file | grep -v '===SEPARATOR==='
line2
line3
line8
...
lineX

这是一个更优雅的答案,不会重复三次分隔符,但我画了一个空白。

答案 2 :(得分:1)

我假设你不需要line5和line6。你可以用这样的awk来做:。

awk '$0 == "===SEPARATOR===" {interested = ! interested; next} interested {print}'

信用转到https://www.gnu.org/software/gawk/manual/html_node/Boolean-Ops.html#Boolean-Ops

输出:

[root@hostname ~]# cat /tmp/1 | awk '$0 == "===SEPARATOR===" {interested = ! interested; next} interested {print}' /tmp/1
line2
line3
line8
...
lineX

答案 3 :(得分:1)

awk救援!

支持多字符(例如gawk)

$ awk -v RS='\n?===SEPARATOR===\n' '!(NR%2)' file

line2
line3
line8
...
lineX

或没有

$ awk '/===SEPARATOR===/{p=!p;next} p' file

line2
line3
line8
...
lineX

与@Jay Rajput的回答几乎相同。

答案 4 :(得分:1)

听起来您想将每个行块保存到单独的文件

以下解决方案创建输出文件f1f2,其中包含===SEPARATOR===行之间的(非空)行块。

使用GNU Awk或Mawk:

awk -v fnamePrefix='f' -v RS='(^|\n)===SEPARATOR===(\n|$)' \
  'NF { fname = fnamePrefix (++n); print > fname; close(fname) }' file

bash -

#!/usr/bin/env bash

fnamePrefix='f'; i=0
while IFS= read -r line; do
  [[ $line == '===SEPARATOR===' ]] && { (( ++i )); > "${fnamePrefix}${i}"; continue; }
  printf '%s\n' "$line" >> "${fnamePrefix}${i}"
done < file