查找字符串的第 n 次出现

查找字符串的第 n 次出现

尽管还有许多类似的问题,但我仍然感到困惑。

qx|o1|md|4SAK9H7DQ876CAJ943,SJT8642H2DKT2CQ76,SQ5HKT653DAJCKT52|rh||ah|Board 1|sv|0|pg||
qx|o2|md|4SKQJ7642H9DQJ8CK8,STHAK8762D74CQJ65,SA85HQJTDAK96CT92|rh||ah|Board 2|sv|0|pg||
qx|o3|md|4ST3HAT9DAK96CA983,S76HK864D732CJT74,SAQJ82HJDQJT85CKQ|rh||ah|Board 3|sv|0|pg||
qx|o4|md|4SAQ4HT65432DAJ4CJ,SJT765HAKDT982C43,SK98HQJ9DK75CAQ92|rh||ah|Board 4|sv|0|pg||

在上面的文本中,如何找到每隔一次出现的4S,并将其替换为3S?(或者,在每隔一行,4S变成3S。)(假设字符串4S在每一行只出现一次。)我在 Sublime Text 或 Windows 上的 Notepad++ 中工作。

答案1

使用 Notepad++:

  • Ctrl+H
  • 找什么:.*?4S.*?\K4S
  • 用。。。来代替:3S
  • 查看 相符
  • 查看 环绕
  • 查看 正则表达式
  • 查看 . matches newline
  • Replace all

解释:

.*?         # 0 or more any character, not greedy
4S          # literally 4S, first one
.*?         # 0 or more any character, not greedy
\K          # forget all we have seen until this position
4S          # literally 4S, second one

截图(之前):

在此处输入图片描述

截图(之后):

在此处输入图片描述

答案2

我猜你需要 sed 或 awk 之类的东西来实现这一点。在 Linux 中的 Bash shell 上,我会使用 sed 和以下命令:

sed -e 'N; s/4s/3s/2' < file.txt

其中file.txt应该包含您的输入行。

启动后,sed 将
- 将第一行拉入 sed 的模式空间,
-N将下一行(第二行)拉入模式空间,
- `s/4s/3s/2' 将用“3s”替换模式空间中第二次出现的“4s”。
之后,这两行将写入标准输出,并开始 sed 的新循环。

显然,您也可以通过它来传输前一个命令的输出。

'command' | sed -e 'N; s/4s/3s/2'

相关内容