使用linux命令搜索单词的脚本

使用linux命令搜索单词的脚本

我有文件,在文件数据中,几行只有一个单词,如果存在这种情况,我想将下一行打印为当前行

我可以得到一些建议吗

grep -E "module" filename   # to fetch the line which contains the "module"

在模块之后,如果没有字符串,则将第二行视为模块行的扩展

例子

module module_name1(i1,i2,i3)
statement1;
statement2;
statement3;
   .
   .
statement;

module 
module_name2(i1,i2,i3)   #observe here
statement1;
statement2;
statement3;
   .
   .
statement;

module module_name3(i1,i2,i3)
statement1;
statement2;
statement3;
   .
   .
statement;

module module_name4(i1,i2,i3)
statement1;
statement2;
statement;
   .
   .
statement;

预期产出

module_name1(i1,i2,i3)
module_name2(i1,i2,i3)
module_name3(i1,i2,i3)
module_name4(i1,i2,i3)

我得到什么输出

module_name1(i1,i2,i3)
                         #missing
module_name3(i1,i2,i3)
module_name4(i1,i2,i3)

缺少我想考虑下一个作为当前行的地方

答案1

$ perl -ne 'if (s/^module\s*//) { $_ = <> if ($_ eq ""); s/\).*/)/; print }' file
module_name1(i1,i2,i3)
module_name2(i1,i2,i3)
module_name3(i1,i2,i3)
module_name4(i1,i2,i3)

这个 perl 单行代码读取每个输入行(-n选项)并尝试从该行的开头删除单词“module”和任何尾随空格。

如果成功,它会检查当前行是否为空。如果是,则读入下一行 ( $_ = <>)。无论哪种方式,它都会删除第一个)字符 ( s/\).*/)/) 之后的所有内容并打印修改后的行。

如果s/^Module\s*//操作失败,则不会打印任何内容,并且脚本将继续执行下一行输入。

答案2

像这样的东西:

grep -A 1 "^module" < filename | sed -n -e 's/^\(module \)*\(.*(.*)\).*$/\2/p'

说明:

  1. grep ...
  • 过滤以“module”开头的行
  • 返回找到的行以及每个找到的行之后的一行 ( -A 1) 输出:
module module_name1(i1,i2,i3)
statement1;
--
module
module_name2(i1,i2,i3)   #observe here
statement1;
--
...
  1. sed ...
  • -n:不打印(安静模式)
  • -e: 脚本如下...
  • s/^\(module \)*\(.*(.*)\).*$/\2/p: 剧本
    • s/.x./.y./.a..x..y.标记替换/替换标记并遵循.a.参数
      • .x.^\(module \)*\(.*(.*)\).*$
        • 是否在行的module开头(前缀)搜索标记( )。这是第一个标记的图案^*\(...\)
        • 第二个模式\(...\)包含任何字符.*(对于您来说是模块名称),后跟括号标记(...)(不带反斜杠),对于您来说是模块参数。括号之间的任意字符.*
        • 后跟任何字符,.*直到行尾$
      • .y.\2
        • 括号内的第二种模式
      • .a.p
        • p用于强制打印(而不是-n选项),因此.y.被打印

输出:

module_name1(i1,i2,i3)
module_name2(i1,i2,i3)
module_name3(i1,i2,i3)
module_name4(i1,i2,i3)

答案3

较短:

$ grep -o 'module_name[0-9].*' file
module_name1(i1,i2,i3)
module_name2(i1,i2,i3)
module_name3(i1,i2,i3)
module_name4(i1,i2,i3)

相关内容