[英]How to grep and remove from a file all lines between a separator
我有一个看起来像这样的文件:
===SEPARATOR===
line2
line3
===SEPARATOR===
line5
line6
===SEPARATOR===
line8
...
lineX
===SEPARATOR===
我该如何进行while循环并遍历文件,将两个===SEPARATOR===
事件之间的所有内容转储到另一个文件中以进行进一步处理? 我只想将line2,line3添加到第一次迭代的第二个文件中。 我将解析该文件; 在下一次迭代中,我希望第二个文件中的line5 line6再次执行相同的解析,但是对不同的数据进行解析。
您可以使用grep -v
排除所有匹配===SEPARATOR===
行,并将其余的行重定向到文件:
grep -vx '===SEPARATOR===' file > file_processed
-x
确保仅排除完全匹配===SEPARATOR===
的行。
它使用sed
查找分隔符之间的行,然后使用grep -v
删除分隔符。
$ sed -n '/===SEPARATOR===/,/===SEPARATOR===/ p' file | grep -v '===SEPARATOR==='
line2
line3
line8
...
lineX
必须有一个更优雅的答案,该答案不会重复分隔符3次,但我正在绘制空白。
我假设您不需要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
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的答案几乎相同。
听起来您想将每一行行保存到单独的文件中 。
以下解决方案创建输出文件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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.