Linux 如何替换一定长度字符串后的星号

Linux how to replace asterisk which only after a certain length of string

我对 Linux 命令有点陌生。最近我得到了一个很大的字符串文件(4GB) 文件格式如下所示。

1,2,http://*.example.org/
1,3,https://*.example.org/
1,4,https://*.example.org/*
1,5,https://example.org/*example

我想查找并替换仅在行首的每个星号。我想要的结果,例如:

1,2,http://replaced.example.org/
1,3,https://replaced.example.org/
1,4,https://replaced.example.org/*
1,5,https://example.org/*example

我所尝试的将取代每一个第一次出现的。无论如何我可以做得到上面的结果吗?

sed 's/*/replaced/' inputfile > outputfile

您可以使用

://*. 替换为 ://replaced.
sed 's~://\*\.~://replaced.~' file > newfile

这里,

  • ~ 用作正则表达式定界符以避免转义 / 个字符
  • ://\*\. 是一个 POSIX BRE 模式匹配 ://*. 子字符串(因为 *. 是特殊字符,它们被转义)

请注意,要匹配字符串开头的星号,您只需要 ^ 锚点。因此,要匹配和替换字符串开头的 *,您可以使用

sed 's/^\*/replaced/' file > newfile

但是,none 的示例文本在任何行的开头都包含一个星号。

如果您打算匹配和替换字符串中特定位置的星号,您可以捕获所需长度的子字符串并替换为对组值和替换文本的反向引用。例如:

sed 's~^\(.\{11\}\)\*~replaced~' file > newfile

仅当它是字符串中的第 12 个字符时才会替换 *(如 1,2,http://*.example.org/ 字符串的情况)。