如何将句子列表中某个句子的一部分提取到单独的文件中,然后替换 notepad++ 中原始句子的一部分?

如何将句子列表中某个句子的一部分提取到单独的文件中,然后替换 notepad++ 中原始句子的一部分?

我有一个文本文件中的句子列表,我想提取 介于之间|句子||TRANSLATION| 到单独的文本文件中的列表(我放置了一个粗体作为我想要提取的占位符)。

按照此,我想编辑列表并替换部分 之间|翻译||END| 按顺序列出我的编辑列表(意味着与我最初提取文本的顺序相同)。

凭借我的基本知识,我想 notepad++ 能够实现我的这些目标,但如果不能,我愿意尝试别人建议的任何其他可行的方法。

(我对格式和术语的糟糕表示歉意。我不是程序员,也不太熟悉如何格式化或使用我正在寻找的最佳术语 - 我相信这些句子部分可以称为这些部分的“表达式” - 以便程序员/专家可以轻松理解。我相信我可以遵循说明,所以我会很感激任何帮助。)

以下是我的列表的一部分,作为示例: notepad++ 中列表部分的图像,格式与此处不同

|SENTENCE|4.3.2.71.0.1.0|TRANSLATION|4.3.2.71.0.1.0|END|
|SENTENCE|BGMの曲名を表示します|TRANSLATION|Displays the song name of the background music|END|
|SENTENCE|BGMの曲名を表示しません|TRANSLATION|Do not display bgm song names|END|
|SENTENCE|BGMの曲名を表示しませんヘルプを表示しません|TRANSLATION|Don't show bgm song name Don't show help|END|
|SENTENCE|BGM効果音音声動画音声をループして再生する動画を再生する|TRANSLATION|Play a video that loops and plays bgm sound effects audio video audio|END|
|SENTENCE|BGVの音量設定ショートカット設定|TRANSLATION|BGV volume setting shortcut settings|END|

将前两个句子提取到单独文件中的列表中的示例:

4.3.2.71.0.1.0

BGMの曲名を表示します

对单独文件中的列表进行编辑的示例:

4.3.2.71.622.1.0

Displays background music

对原始文件中前两句话进行替换的示例:

|SENTENCE|4.3.2.71.0.1.0|TRANSLATION|4.3.2.71.622.1.0|END|
|SENTENCE|BGMの曲名を表示します|TRANSLATION|Displays background music|END|

编辑:

无论如何,我在第一步提取时遇到了问题(我还没有尝试第 2 步)。大多数文本都被正则表达式正确提取\|SENTENCE\|(.*)\|TRANSLATION\|.*。但是,某些文本保持不变,(

示例 4:

|SENTENCE| 0001   0120/12/09
   23:33「動かないで。今楽に」|TRANSLATION| 0001 0120/12/09\r\n   23:33 \"Don't move. \"|END|

示例 5:

|SENTENCE|。【梢】「気になるの?」あ「俺でよければ」
あ「べ、別に」
|TRANSLATION|。 【Na】\"Are you bothered?\" Ah, if you don't mind me.\nAh, be, separately.\n|END|` 

我不认为会发生这种情况,所以我省略了在我的帖子示例中发布这些不寻常的句子,但现在我意识到我的天真。我怀疑这是由于空格引起的,而正则表达式没有考虑到行与行之间的空格。我阅读并浏览了您链接到的 ryan 教程的所有部分,并找到了简写字符类。特别是我发现s,它显然与空格匹配。我将其插入到您给我的表达式中,\|SENTENCE\|(.*\s)\|TRANSLATION\|.*我还尝试了\|SENTENCE\|(.*\s*)\|TRANSLATION\|.*,两者都与 22 个句子匹配(

示例 6:

|SENTENCE|うーん……どうしたら、解ってくれるんだろう?
|TRANSLATION|Well let's see...... How can you solve it?\n|END|

),但不是此编辑中列出的前两个示例。当我尝试时,\|SENTENCE\|(/s.*)\|TRANSLATION\|.我收到 0 个匹配项。

我有点不确定如何正确构造正则表达式以使其匹配此评论中列出的示例 4 和 5(理想情况下是 6 以及第一个正则表达式匹配的文本),因此我想就此事寻求更多指导/澄清(@NotTheDr01ds 或任何看到此问题并可以提供帮助的人)。

答案1

如果我理解你的问题没有错的话,你有两个源文件,我们把它们称为original.txt(你的第一个例子)和myedits.txt(第三个)。你需要两组期望的结果,extractions.txt(第二个例子)和replacements.txt(第四个例子)。

如果仍然不正确,请告诉我。

但如果这是正确的,那么这就是我的想法。

步骤 1 - 使用正则表达式提取

要获取extractions.txt,您要查找的功能称为“正则表达式搜索和替换”(通常缩写为“regex”),我发现 Notepad++ 支持此功能。数百个其他程序也支持此功能(以某种形式)。

学习基本正则表达式是我强烈推荐的。它只是让很多批量编辑任务更容易。

不同的正则表达式实现之间存在细微的差异,因此我不得不查找 Notepad++ 是如何实现的。Notepad++ 正则表达式文档常见问题解答这很有帮助,但前提是你已经了解了基础知识。虽然该常见问题解答说“新手”应该从 Notepad++ 文档开始,但请忽略该建议——它仍然是一个过于“技术性”的描述。该常见问题解答的下方是解释事情的教程链接很多更清楚 ...https://ryanstutorials.net/regular-expressions-tutorial/

但回到你手头的问题。在 Notepad++ 中打开“替换”对话框(Ctrl+H或使用菜单Search-> Replace):

在此处输入图片描述

图片来源:Haider M. al-Khateeb 博士使用 Notepad++ 理解 RegEx

对于Find what,请尝试:

\|SENTENCE\|(.*)\|TRANSLATION\|.*

用正则表达式来说,就是“找到 |SENTENCE| 和 |TRANSLATION| 之间的任意字符并存储它们。此后的所有内容,我们都不关心。”

每个中的反斜杠\|是因为|字符在正则表达式中是“特殊的”,所以我们必须通过在它前面加上反斜杠来“转义”它,以告诉它我们确实想要找到一个实际的|.是“任何字符”, 表示*“尽可能多地找到”。 围绕第一个的括号.*创建一个“捕获组”,它告诉它您想要“存储”什么以便稍后在替换中使用。

要创建第一个文件,Replace with应该简单地使用\1$1(根据 Notepad++ 文档,两者都可以工作)。同样,用正则表达式来说,这表示“用我要求您存储的第一组字符替换您找到的整行”。

将结果文本保存为extractions.txt,然后返回原始文本(Undo可能同样有效)。

步骤 2 - 合并两个文件,将每一行附加edits.txtoriginal.txt

这有点棘手,但至少有两种方法可以在 Notepad++ 中实现它,而无需进行任何“脚本编写”。

步骤 2,方法 1 - 列模式

第一种方法是使用 Notepad++ 列模式。虽然有点“老套”,但确实有效。总结一下:

  • 按住myedits.txtAlt并选择整个文件。由于您处于“列模式”(我喜欢将其视为“块模式”),因此您需要选择全部的文本块,这意味着您将把选择范围向右延伸至最长的行。

  • 将其复制到剪贴板

  • original.txt,转到第一行的末尾

  • 添加一堆空格以确保第一行是文件中最长的行

  • 将光标放在第一行的末尾,粘贴“列块”,使 中的每一行都myedits.txt出现在 中相应行的末尾original.txt

  • 对我来说,列模式“粘贴”操作在几行末尾留下了一些意外的空格。为了消除这个问题,我使用正则表达式替换了 ,但\W*$没有添加任何内容(只是删除了空白)。

  • 然后,将编辑后的文本与原始翻译交换的正则表达式将是……

    • 寻找:\|SENTENCE\|(.*)\|TRANSLATION\|.*\|END\|\W*(.*)\W*$
    • 代替: |SENTENCE|$1|TRANSLATION|$2|END|

正则表达式解释:

  • 我们涵盖了、、及以上()群体。.*\|$1
  • 匹配\W*column-mode 创建的空格。它表示抓取尽可能多的空格并忽略它(因为我们没有将其放入捕获组中)。我们还丢弃了 column-mode 放入的行末尾的一些错误空格。
  • 行尾的$表示“行尾”。
  • 您会注意到,我们不需要“转义”|替换文本中的字符。这是因为它们对于正则表达式替换来说并不“特殊”,而只是对于匹配来说。

还有其他方法可以构建相同的正则表达式,这些方法更简洁,但可能有点难以理解。

步骤 2,方法 2 - 录制宏以将每行从移动myedits.txtoriginal.txt

我认为我更喜欢这种方法。录制宏本质上让您无需“编程”即可创建“程序”,只需使用与手动执行相同操作相同的一组按键即可。

唯一的缺点(恕我直言)是您需要知道如何使用按键而不是鼠标来执行每个操作。

Notepad++ 有一个很棒的功能,可以让您对文件的每一行重复相同的操作。

首先,由于您将在两个文件中录制并播放此宏,因此您需要转到Settings-> Preferences->MISC并关闭Document Switcher默认开启的选项。

然后,同时打开original.txtmyedits.txt,使它们分别位于各自的选项卡中。确保它们是 Notepad++ 中唯一打开的两个选项卡。

  • original.txt光标置于第一行的行首 ( Ctrl+Home)。

  • Macro-> Start Recording(在我们完成宏之前,这是唯一可以用鼠标完成的事情。从现在开始只能使用键盘)。

  • End(将光标移动到第一行的末尾)

  • Ctrl+Tab(切换至myedits.txt

  • Shift+End(选择第一行)

  • Ctrl+X(将该行剪切至剪贴板)

  • Del(删除产生的空白行)

  • Ctrl+Tab(切换回original.txt

  • Ctrl+V(将剪切线粘贴在第一行末尾)

  • Down Arrow(当然,将光标移动到下一行)

  • Home(将光标移至行首

  • Macro-> Stop Recording(使用鼠标)

  • 不要移动光标 - 将其留在第二行的开头。

结果是,我们将您的第一个编辑从 移至myedits.txtoriginal.txt最重要的是,我们在第二行的位置与我们在第一行开始录制的位置完全相同。此外,第一行现在myedits.txt包含第二个替换句子的文本)。

这意味着如果您运行宏(Macro-> Playback),您将把下一行文本移动到第二行original.txt。再做一次,您将得到第三行。

但是 Notepad++ 让这一切变得更加简单。只需使用Macro->Run a Macro Multiple Times并选择Run until end end of file让它在每一行上重复。这会移动除最后一行之外的所有内容(我不太清楚为什么),但再次运行它会将最后一行也移动过去。

好的,从这里您可能能够找出进行最终替换所需的正则表达式,但既然我们已经走到这一步了......我上面创建的相同正则表达式(用于列模式)将起作用,因为它说“删除前后多余的空格(但前提是无论如何都有空格)。”但由于我们没有任何多余的空格,因此使用此方法,您可以将其简化为......

  • 寻找: \|SENTENCE\|(.*)\|TRANSLATION\|.*\|END\|(.*)
  • 替换:(|SENTENCE|$1|TRANSLATION|$2|END|与“步骤 2,方法 1”完全相同)

好吧,这有点像一本“书”,但我希望(a)这能帮助你完成你所需要的,(b)我提供了一些将来对你有用的技巧。

我知道我已经了解了一些有关 Notepad++ 的知识。我认为我个人还是更喜欢使用类 Unix 工具,但拥有另一种可能的工具总是好的。

相关内容