将字符串替换为其自身的一部分

将字符串替换为其自身的一部分

我正在清理存储在文本文件中的数据。每行都以类别标签开头,后跟我要清理的实际数据。不同的子文件夹中有许多文本文件,因此我通常egrep将文件名传递到sed.

CON: the Unix and Linux question
SEM: eins, the zwei, drei
AUTH: , the
AFF: The holy seat
TTITLE: As we go, the Kuckuck comes too

现在,在以 I 开头的每一行中,后面的内容都(SEM|AFF|CON)将被替换。也就是说,数据稍后应该看起来像(T|t)he[ ]*(:|\,)

CON: Unix and Linux question
SEM: eins, zwei, drei
AUTH: , the
AFF: holy seat
TTITLE: As we go, the Kuckuck comes too

到目前为止,我尝试通过两个步骤来实现这一目标,一个用于:- 部分,另一个用于,- 部分。但我已经迈出了第一步。

第一部分 识别文件的命令/模式是egrep -rl ^"(SEM|CON|AFF)\: (t|T)he".这按预期工作。

现在当我这样做时

egrep -rl ^"(SEM|CON|AFF)\: (t|T)he" | xargs sed -i 's/\((SEM|CON|AFF)\: \)(t|T)he[ ]*/\1/g'

什么都没发生。我的sed部分有错吗?我不能反向引用((SEM|CON|AFF)\:with\1吗?

第二部分 识别文件的命令/模式是egrep -rl ^"(SEM|CON|AFF)\:.*\,[ ]*(t|T)he".这也按预期工作。但sed到目前为止我尝试过的每一个组合都会删除内容。

答案1

我会使用以下内容:

sed -r '/(SEM|AFF|CON)/ s/([:,] *)[Tt]he */\1/g' file

添加-i就地更改文件的选项。

答案2

只需使用一个 sed 表达式(需要 GNU sed):

sed -r -i -e '/(SEM|AFF|CON)/s/([:,]\s*)the\s+/\1/ig' *

sed 命令开头的搜索模式将替换限制为以所选类别开头的行。i替换命令 ( ) 的标志使s//模式不区分大小写;该g标志允许在一行中进行多次替换。\s代表任何空白(空格、制表符)。

使用sed带标志的扩展正则表达式-r;例如,GNU sed 支持这一点。该-i标志启用就地编辑。 shell 扩展*到当前目录中的所有文件。

该模式确保后面至少有一个空格或制表符,the以便以thelike开头的单词theater不会被替换。

答案3

试试这个方法:

egrep -rl "^(SEM|CON|AFF)\: (t|T)he" * | xargs sed -r -i 's/(^(SEM|CON|AFF):\s)((t|T)he[ ]*)/\1/g'

答案4

使用(以前称为 Perl_6)

~$ raku -pe 's/^ [SEM|AFF|CON] <+[:,]>  \s  <( [T|t] he \s+ //;'  file

输入示例:

CON: the Unix and Linux question
SEM: eins, the zwei, drei
AUTH: , the
AFF: The holy seat
TTITLE: As we go, the Kuckuck comes too

示例输出:

CON: Unix and Linux question
SEM: eins, the zwei, drei
AUTH: , the
AFF: holy seat
TTITLE: As we go, the Kuckuck comes too

基本上,如果您使用理解/实现代码,您可以轻松解决这个问题捕获标记。在 Raku 中,捕获标记符号是<(…… )>。并非两个捕获标记都需要使用。

捕获标记有什么作用?上面在替换运算符的识别部分中,s///所有元素都被识别:

^ [SEM|AFF|CON] <+[:,]> \s <( [T|t] he \s+

但由于捕获标记,只有右侧的所有内容<(都保留为“捕获”,即:

<( [T|t] he \s+

现在我们已经识别了一个更大的序列,并在“捕获”中保留了一个子序列,我们将“捕获”替换为空,从而获得所需的结果。注意:上面代码中的最终正则表达式原子是\s+,而不是\s*。这可以防止The从标题中删除,例如“相对论”。

https://docs.raku.org/language/regexes#Capture_markers:_%3C(_)%3E
https://docs.raku.org/language/regexes
https://raku.org

相关内容