,所以我想将编号列表从一个特定表单转换为另一种表单。
来自此形式:
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