我正在清理存储在文本文件中的数据。每行都以类别标签开头,后跟我要清理的实际数据。不同的子文件夹中有许多文本文件,因此我通常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
以便以the
like开头的单词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