我要复制数字 795,并将其用于另一个文件。这个 795 可以是任何数字,并且可以因文件而异。直到企业为止的所有内容都将保持不变,甚至结尾的花括号也是如此
OBJECT IDENTIFIER ::= { enterprises 795 }
将会出现在其他文件中
VAR="759"
我想在SED 或 Grep。 感谢您的帮助!
答案1
使用grep
使用 PCRE(Perl 兼容正则表达式):
grep -Po '.* \K\d+(?= }$)'
.* \K
将匹配数字前的空格,并\K
丢弃匹配\d+
将匹配一个或多个数字零宽度正向前瞻将确保匹配在最后
(?= }$)
进行。}
$ var="$(grep -Po '.* \K\d+(?= }$)' <<<'OBJECT IDENTIFIER ::= { enterprises 795 }')" $ echo "$var" 795
对于任何文件(其中会有多个匹配项),最好将匹配项保存为数组元素,以便稍后可以对它们进行迭代:
var=( "$(grep -Po '.* \K\d+(?= }$)' file.txt)" )
使用sed
:
$ sed -r 's/.* ([0-9]+) }/\1/' <<<'OBJECT IDENTIFIER ::= { enterprises 795 }'
795
-r
将允许使用扩展的正则表达式.*
将匹配数字前的空格([0-9]+)
将匹配数字并将匹配项放入组中我们刚刚使用组
\1
即数字作为替换模式。
对于任何文件(其中会有多个匹配项),最好将匹配项保存为数组元素,以便稍后可以对它们进行迭代:
var=( "$(sed -nr 's/.* ([0-9]+) }/\1/p' file.txt)" )
答案2
grep "OBJECT IDENTIFIER" testfile1.txt | awk '{sub("}","");print $5}'
解释:由于您已请求 grep ,因此我使用 grep 来获取您想要的字符串。Awk 打印第 5 列(因为在 awk 中,默认情况下列由空格分隔),即795}
。sub
函数仅用}
空白替换。结果是您提取数字本身。
笔记:awk 可以使用 form 自行完成所有操作,无需 grep /SEARCHTERM/
。代码如下:
awk ' /OBJECT IDENTIFIER/ {sub("}","");print $5}' testfile1.txt
请注意,在这两个代码版本中,您都依赖于查找字符串并提取花括号之间的数字,因此无论数字是什么,只要它位于正确的字符串旁边,您仍然会提取它。
带有 grep 和 cut 的版本
第一个命令的替代版本稍微长一点,如下所示:
grep "OBJECT IDENTIFIER" testfile1.txt | cut -d '{' -f2 | cut -d'}' -f1 | cut -d' ' -f2
cut
命令的作用正如其名称所示 - 在特定分隔符后截断内容。因此,我们在这里找到必要的字符串(输出为OBJECT IDENTIFIER ::= { enterprises 795 }
),截断“{”后面的第二个内容(输出现在为enterprises 795 }
),截断“}”前面的内容(现在我们有enterprises 795
),并截断“ ”后面的第二个内容(空格)(现在我们得到795
或那里的任何数字)。