这个复杂的正则表达式有什么作用?

这个复杂的正则表达式有什么作用?

这个正则表达式取代了什么:

\([^:]*\):\(.*\)

答案1

该正则表达式通常用于从/etc/passwd文件中提取用户名。例如

sed 's/\([^:]*\):\(.*\)/\1/' /etc/passwd

仅根据密码返回用户名passwd

1st Capturing Group ([^:]*)

Match a single character not present in the list below [^:]*
* Quantifier — Matches between zero and unlimited times, as many times as possible, giving back as needed (greedy)
: matches the character : literally (case sensitive)
: matches the character : literally (case sensitive)
2nd Capturing Group (.*)
.* matches any character (except for line terminators)
* Quantifier — Matches between zero and unlimited times, as many times 

简而言之。

第一部分:

    sed 's/\([^:]*\):    
          /\([^:]*\): Match the string till you see a colon `:` and group.

第二部分:

   sed \(.*\)/\1/' /etc/passwd
       \(.*\)  Match everything after `:` and group

现在我们有 2 个组,我们可以back-reference使用\1它来指示我们想要引用第一组并打印这些结果。

答案2

该正则表达式不执行替换操作,这只是没有上下文的正则表达式。

需要知道完整的命令。但我可以假设这种模式符合:

(any symbol except : repeated zero or more times):(any symbol remeated zero or more times)

/etc/passwd因此您可以使用此模式获取用户名。

sed可以使用-r选项来省略(),您的模式将变得最简单。在 's//\1/' 中插入您的模式:

sed -r 's/([^:]*):(.*)/\1/' /etc/passwd

输出将是:

root
daemon
bin
sys
sync
games

答案3

这可能只是删除字符串中的第一个冒号。

sed 's/\([^:]*\):\(.*\)/\1\2/' <<<"Hello:Unix:Users"
HelloUnix:Users

\([^:]*\)会匹配任何内容,直到不是冒号(或直到看不到冒号)。

然后匹配...\):\(...该冒号。以及\(.*\)之后的一切。但是当\(..\)使用时,这表明sed将它们捕获为一组匹配及其相应的索引(或在主back-references)对于第一个将是\1,对于下一个\2等等。

我可能提到过,因为谁想在sed替换部分使用这些很重要,也许她/他想用分号替换第一个冒号。

sed 's/\([^:]*\):\(.*\)/\1;\2/' <<<"Hello:Unix:Users"

或者也许她/他想在之间添加另一个字符串而不是冒号:

sed 's/\([^:]*\):\(.*\)/\1 Linux and \2/' <<<"Hello:Unix:Users"

或者任何你能做的和替换的:)

答案4

它是一个基本的正则表达式(而不是扩展的正则表达式),捕获第一个冒号之前的所有内容以及它之后的所有内容。

作为扩展的正则表达式,它匹配冒号之前的带括号的字符串,然后匹配冒号之后的另一个带括号的字符串,同时假设输入的带括号的位本身不包含括号。

假设它是一个基本的正则表达式,它将捕获输入中的两个字符串first partsecond part:third part

first part:second part:third part

\1这两个字符串将在和中可用\2,或者在某些其他变量或数组中可用,具体取决于所使用的工具。

相关内容