将部分复制到新文件中

发布于 2024-09-13 07:00:06 字数 282 浏览 3 评论 0原文

我有一个文本文件,

!--- Marker one --!
aaaa
bbbb
cccc
dddd
!--- Marker two --!
eeee
ffff
!--- Marker three --!
gggg
hhhh
iiii


我需要使用 Bash 将标记二(直到标记二的末尾)复制到一个新文件中。

!--- Marker two --!
eeee
ffff

成为一个单独的文件。

I have a text file,

!--- Marker one --!
aaaa
bbbb
cccc
dddd
!--- Marker two --!
eeee
ffff
!--- Marker three --!
gggg
hhhh
iiii

And I need to copy from Marker two (till the end of Marker two) into a new file, using Bash.

!--- Marker two --!
eeee
ffff

Becomes a separate file.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

手心的海 2024-09-20 07:00:08

awk

$ awk '/Marker two/{f=1;print;next}f&&/Marker/{exit}f' file
!--- Marker two --!
eeee
ffff

bash

#!/bin/bash

flag=0
while read -r line
do
  case "$line" in
     *"Marker two"*)
         flag=1; echo $line;continue
  esac
  case "$flag $line" in
   "1 "*"Marker"* ) exit;;
   "1"* ) echo $line;;
  esac
done <"file"

sed

$ sed  -n '/Marker two/,/Marker three/{/Marker three/!p}' file
!--- Marker two --!
eeee
ffff

awk

$ awk '/Marker two/{f=1;print;next}f&&/Marker/{exit}f' file
!--- Marker two --!
eeee
ffff

bash

#!/bin/bash

flag=0
while read -r line
do
  case "$line" in
     *"Marker two"*)
         flag=1; echo $line;continue
  esac
  case "$flag $line" in
   "1 "*"Marker"* ) exit;;
   "1"* ) echo $line;;
  esac
done <"file"

sed

$ sed  -n '/Marker two/,/Marker three/{/Marker three/!p}' file
!--- Marker two --!
eeee
ffff
淡笑忘祈一世凡恋 2024-09-20 07:00:08

使用“sed”可以做什么的经典案例:

sed -n '/^!--- Marker two --!/,/^!--- Marker three --!/{
        /^!--- Marker three --!/d;p;}' \
    infile > outfile

唯一的问题是第一个标记在数据中出现多次。模式匹配本节的开头和下一节的开头;大括号内的命令删除第二部分开头的行,并打印所有其他行。

您还可以使用“w”命令处理多个此类模式以分隔文件(匹配方案略有不同 - 但如果需要,可以适应上面的模式):

sed -n -e '/!--- Marker one --!/,/!--- Marker two --!/w file1' \
       -e '/!--- Marker three --!/,/!--- Marker four --!/w file2' infile

等等。

Classic case of what you can do with 'sed':

sed -n '/^!--- Marker two --!/,/^!--- Marker three --!/{
        /^!--- Marker three --!/d;p;}' \
    infile > outfile

The only gotcha is if the first marker appears more than once in the data. The patterns match the start of section and start of the next section; the commands within the braces delete the line for the start of the second section, and print all the other lines.

You can also process multiple such patterns to separate files using the 'w' command (slightly different matching scheme - but can be adapted to the one above if need be):

sed -n -e '/!--- Marker one --!/,/!--- Marker two --!/w file1' \
       -e '/!--- Marker three --!/,/!--- Marker four --!/w file2' infile

Etc.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文