我有以下文件示例:
some text is here
sometext(1,21);
sometext(2,9);
sometext(3,231);
sometext(10,1112);
sometext(11,17)
Some text is here
我试图提取包含 的行括号中的第二个数字sometext
,因此在上面的示例中,数字21
, 9
, 231
, 1112
, 17
。
我没有找到适合grep
上述模式的命令。
答案1
如果您使用的是 GNU,grep
则可以使用 RE 来匹配逗号后的数字
grep -oP ',\K\d+' file
本机perl
等效项是这样的
perl -lne 'print for /,\K\d+/g' file
答案2
该grep
实用程序不适合提取行的一部分,至少如果您想使用标准 Unix 工具。标准grep
实用程序过滤与模式匹配的完整线条,但没有自然的方法来提取部分线条。为了以更详细的方式操作线条,可以使用,例如sed
。
假设文本比您显示的文本更长且更多样,我们可以让文本字符串sometext(
告诉我们何时处理第二个整数值的行。一旦我们在数据中看到该字符串,我们就可以修剪掉第二个整数之前和之后的侧翼位。
在这里,我们应用了两种修剪替换,一种是从行首到包括该行最后一个逗号,另一种是从右括号到行尾。我们关闭每行的默认打印,-n
并在第二次替换后显式打印结果字符串。
sed -n '/sometext(/ { s/.*,//; s/).*//p; }' file
我们还可以选择删除与特殊触发字符串不匹配的任何行,并将两个替换应用于剩余的任何行。
sed -e '/sometext(/!d' -e 's/.*,//' -e 's/).*//' file
如果您希望得到的数字列表作为逗号分隔的列表(就像您在问题中显示的那样),那么请考虑通过管道传输上述命令的结果
paste -d, -s -
根据您问题中的数据,我们得到:
$ sed -e '/sometext(/!d' -e 's/.*,//' -e 's/).*//' file | paste -d, -s -
21,9,231,1112,17
答案3
我会使用awk
逗号或右括号 ( -F'[,)]'
) 的字段分隔符来实现此目的。这将在字段 2 ( $2
)中生成您想要的数字。将其与 $2 仅包含数字的检查结合起来:
$ awk -F'[,)]' '$2 ~ /^[[:digit:]]+$/ {print $2}' input.txt
21
9
231
1112
17
这假设 $2 仅包含非负整数。如果它可能包含负数和/或实数,请改用以下内容:
awk -F'[,)]' '$2 ~ /^[-+]?[[:digit:]]+(\.[[:digit:]]+)?$/ {print $2}' input.txt
注意:因为 awk 使用逗号作为字段分隔符,所以这在使用逗号作为小数分隔符的语言环境中不起作用。
答案4
您可以使用grep
来完成繁重的工作,然后使用 - 进行清理tr
- 假设您不需要逗号。从帖子中也不清楚您希望如何呈现输出,这会生成一个换行符分隔的数字列表。
grep -Eo ",[[:digit:]]+" input.txt | tr -d ","
或者,避免使用tr
作为grep
唯一的解决方案:
grep -Eo ",[[:digit:]]+" input.txt | grep -Eo "[^,]+"