我有一个看起来像这样的文件:
===SEPARATOR===
line2
line3
===SEPARATOR===
line5
line6
===SEPARATOR===
line8
...
lineX
===SEPARATOR===
如何执行while循环并浏览文件,将两个===SEPARATOR===
次出现之间的任何内容转储到另一个文件中以进行进一步处理?
我想在第一次迭代时只将line2,line3添加到第二个文件。我会解析文件;在下一次迭代中,我希望第二个文件中的line5 line6再次对不同的数据进行相同的解析。
答案 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)
听起来您想将每个行块保存到单独的文件。
以下解决方案创建输出文件f1
,f2
,其中包含===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