我有以下格式的数据页面:
{1,2,3,4,5,6} {1,3,4,5,6,7} {1,2,4,5,6,7}{1,2,3,5,6,7}
为了澄清起见,我将把 {} 包围的 6 个逗号分隔数字的每个实例称为"单词"。
所以在上面的例子中,{1,2,3,4,5,6} 将是一个单词。
所以我要做的是找到每个包含我选择的 4 个数字的单词。例如,在上面的示例中,我想找到包含数字 1、2、6 和 7 的所有单词。这里的关键点是 AND。我知道如何找到 1、2、6 或 7 - 我需要 AND。如果可能的话,我想替换整个单词,但如果它只是找到数字,我可以用另一个正则表达式删除单词的剩余 2 个数字。
有关我的数据的更多信息:数字范围从 1 到 25。(所以我需要能够找到 1 的东西,不一定包括数字 21、10-19 或 2,不包括 12 或 20-25。一个单词中永远不会重复一个数字。单词中的数字始终按从最低 (1) 到最高 (25) 的顺序排列。
更新:
您告诉正在使用PSPad
并希望在编辑器中执行此操作。我认为使用正则表达式是不可能的。我会使用awk
或您选择的编程语言。
下面是一个使用 awk
的示例:
awk '{for(i=1;i<=NF;i++)if($i~/y1y/&&$i~/y2y/&&$i~/y6y/&&$i~/y7y/)$i=""}1' input.txt
解释:
for
循环遍历一行的所有字段,if
条件检查该字段是否与所有必需的数字匹配。如果它匹配所有数字,则字段将被截断。以下1
是用于打印由输出分隔符(默认情况下为输入分隔符)分隔的所有字段的awk
习惯用法。
关于数字匹配,我在数字之前和之后使用转义序列y
:
$i~/y1y/
y
匹配一个单词边界,在这种情况下,该边界要么{
,
要么是结束}
,以确保上面的模式仅匹配1
,而不匹配11
例如。
输出:
{1,2,3,4,5,6} {1,3,4,5,6,7}
顺便说一句,如果您将上面的脚本保存到文件中,则可以更具可读性和可维护性:
删除.awk:
# Applies to every line of input
{
for(i=1;i<=NF;i++) {
# Check whether the field matches all required numbers
if(
$i~/y1y/
&& $i~/y2y/
&& $i~/y6y/
&& $i~/y7y/
) {
# Truncate field
$i=""
}
}
# Print the modified line
print
}
您可以像这样调用脚本:
awk -f remove.awk input.txt