我是 sed 新手,我有一个字符串
lightdm --session-child 14 21
这两个数字可能会改变,我会删除 lightdm 之后的所有内容
我尝试了各种方法,但都没有用
sed 's/ --session-child*//'
sed 's/\ --session-child*//'
sed 's/ --session-child*$//'
和其他方法,但都不起作用,哪里出了问题?
我是 sed 新手,我有一个字符串
lightdm --session-child 14 21
这两个数字可能会改变,我会删除 lightdm 之后的所有内容
我尝试了各种方法,但都没有用
sed 's/ --session-child*//'
sed 's/\ --session-child*//'
sed 's/ --session-child*$//'
和其他方法,但都不起作用,哪里出了问题?
*
在正则表达式中表示“重复前一个字符(或字符类)任意多次。因此,--session-child*
匹配--session-chil
--session-child
--session-childd
--session-childdd
--session-childddd
但是,它不匹配
不是 a
--session-child 1
,因为 ad
!(并且 a 也不是1
,但是那已经不重要了。 的连续性d
被打破了。)如果您想表示“任何单个字符”,那么在正则表达式中就是
.
。如果您的意思是“任意多个任意字符”,那么就是.*
。所以你需要
sed 's/ --session-child.*//'
但是,我倾向于主张匹配您想要的东西,而不是删除您不想要的东西。我不知道您最初的目的是什么,但假设您想保留第一个空格之前的任何内容,我会将其写为
。如果可能的话,重复多次(0次或更多)(第一个
sed 's/^\([^ ]*\) .*$/\1/'
。含义:从行首()开始^
,开始一个新组(封装在\(
…中\)
)。该组包含由描述的字符类(封装在[
…中]
)中的任何字符^
,这意味着“除了”(^
)空格字符之外的所有内容*
)。如果之后有空格,则吸收该空格和所有字符直到行末(
$
),并用第一个(也是唯一一个)匹配的组替换它们\1
。写下来要费更多的力气。我为什么要这么做?因为写下你不想要的东西通常是一种脑力锻炼,它涉及到与实际问题无关的假设。例如,在这里你假设前面的任何内容的第一个参数是
--session-child
。现在,如果那个“任何内容”不是lightdm
,为什么它需要一个--session-child
参数?如果它总是为什么lightdm
,你会使用sed
吗?你只需输出lightdm
。因此,通过不对“可爱的小事实”做出假设,而是专注于我真正关心的事情,我可以避免未来因输入我意想不到而导致的错误。