使用 GREP 或 SED 将特定文本从一个文件复制到另一个文件

使用 GREP 或 SED 将特定文本从一个文件复制到另一个文件

我要复制数字 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或那里的任何数字)。

相关内容