如何使用SED来识别多条线的模式



,所以我想将编号列表从一个特定表单转换为另一种表单。

来自此形式:

1. numberedlist
2. one
3. two

此表格:

# numberedlist
# one
# two

我使用SED在该文件上进行了另一个更改。因此,我想使用SED识别第一个形式时,即使编号列表包含3个以上的项目,也没有限制。

我对此的想法是:

首先:调用包含模式的行(是数字> a dot> a空间.... '[[:digit:]]. ')到模式空间

第二个:将下一行调用到模式空间,并检查它是否包含'[[:digit:]]. '。并继续执行此操作,直到下一行不将正则脉冲连接。然后将其替换为#s。但是,是的,我不知道这是否可能。

这是我现在正在使用的:

s/[[:digit:]]. /# /

但是,是的,我知道这不是很好。我仍然是SED世界的新手,因此任何帮助都对此表示赞赏。谢谢。

编辑:对不起,对于混乱的家伙来说,我的目标是将列表索引更改为#。任何数字从1开始。到#。我只想将编号列表转换为自动化引擎的降价。

我不能使用诸如 s/[[:digit:]]. /# /之类的东西,因为它也会改变模式的任何姿态,即使它不是列表。

一种可能的sed解决方案:

sed -r 's/^[[:digit:]]+. /# /g' <inputfile>
  • -r:将搜索模式视为扩展正则正则
  • /^[[:digit]]+. /# /g:寻找以1个或更多位数开始的线,然后是一个时期和一个空间,如果发现的话,则替换为 #,然后是空间
  • 将所有其他线路视为(即不要进行任何更改)

例如:

$ cat datfile
1. numberedlist
2. one
3. two
where in the world is waldo
10. pickles
15. jam
# I'm just a comment
sky blue
100. bash
101. ksh
102. csh
72.don't touch this
# rubber ducky

和我们的sed脚本的测试运行:

$ sed -r 's/^[[:digit:]]+. /# /g' datfile
# numberedlist
# one
# two
where in the world is waldo
# pickles
# jam
# I'm just a comment
sky blue
# bash
# ksh
# csh
72.don't touch this
# rubber ducky

只需使用 awk

$ echo "1. numberedlist
2. one
3. two
55. fifty-five" | awk '{$1="#"} 1'
# numberedlist
# one
# two
# fifty-five

如果您只想检测以数字开头的行:

$ echo "1. numberedlist
2. one
3. two
look ma no digit line
55. fifty-five" | awk '/^[[:digit:]]+. /{$1="#"} 1'
# numberedlist
# one
# two
look ma no digit line
# fifty-five

但是,如果您想要sed

$ echo "1. numberedlist
2. one
3. two
look ma no digit line
55. fifty-five" | sed 's/^[[:digit:]][[:digit:]]*. /# /'
# numberedlist
# one
# two
look ma no digit line
# fifty-five

最新更新