这个正则表达式取代了什么:
\([^:]*\):\(.*\)
答案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 part
和second part:third part
first part:second part:third part
\1
这两个字符串将在和中可用\2
,或者在某些其他变量或数组中可用,具体取决于所使用的工具。