我有文件,在文件数据中,几行只有一个单词,如果存在这种情况,我想将下一行打印为当前行
我可以得到一些建议吗
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'
说明:
grep ...
- 过滤以“module”开头的行
- 返回找到的行以及每个找到的行之后的一行 (
-A 1
) 输出:
module module_name1(i1,i2,i3)
statement1;
--
module
module_name2(i1,i2,i3) #observe here
statement1;
--
...
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)