我有一个文件,让我们称之为input.txt
。它有很多行,但唯一相关的一行包含一个模型语句;height ~ mu gender
它还可以包含;height !n ~ mu date_birth !r g
因此,在正则表达式中标识行的一致性因子将是^height.*~.*$
。至少到目前为止,这是我设计的。
我想追加!r g
到结束行只有当!r g
还没有出现。我试着把here、here和here的答案混合在一起,但我找不到。我更喜欢一个命令。也一直在玩复杂的awk
和sed
的,但我觉得这是过于简单,它不需要太难的人与经验。
预期结果:
如果height ~ mu gender
,则height ~ mu gender !r g
。
如果height !bin ~ mu date_birth !r g
,那么什么都不需要发生。
如果height !bin ~ mu gender
,则height !bin ~ mu gender !r g
编辑:
到目前为止,我试过了;
如果!g
存在,则sed '/^height.*~.*!r.*$/ ! s/$/!r g/' input.txt
正确跳过行,但将其附加到input.txt
中的每一行。sed '/^height.*$/s/$/!r g/' input.txt
,仅正确地附加到匹配行,而且如果!r g
已经存在。
5条答案
按热度按时间cwxwcias1#
我们可以用sed来做这件事。首先,我们选择开始为
height
且包含~
的行。对于这些行,如果行的结尾不是!r g
,我们可以用!r g
替换行的结尾:演示
nvbavucw2#
另一个在awk:
或者使用更改的数据:
注意正则表达式中的
\r?
,它是Windows行的第一部分,以\r\n
结尾。如果它存在,它将被替换。sauutmhj3#
例如
更新
上面的
sed
命令将考虑所有具有模式^y.*~.*$
的行,并且仅当该行的任何部分都不包含!r g
时才将!r g
附加到行的末尾。要更改过滤的行,只需将开始的正则表达式
^y.*~.*$
更新为您需要的。rdlzhqv94#
inkz8wg95#
我们如何在行的末尾附加关键字“world”,以防它从那里丢失:
一个实际的例子:在行尾添加关键字“[not installed]”,以防此处缺少相反的关键字(“[installed*”):