Bash 仅当行不';不包含关键字

Bash 仅当行不';不包含关键字,bash,shell,Bash,Shell,我有一个文件,我们把它叫做input.txt。它有许多行,但唯一相关的行包含一个模型语句 身高~mu性别 它还可能包含: 高度!n~mu date_出生!r g 因此,在正则表达式中标识行的一致性因子是^height.*.*.$。 至少到目前为止,这是我设计的 我想附加!只有在的情况下,才将r g移动到结束行!r g尚未出现。我试着把答案和,和混在一起,但我想不出来。我更喜欢单一命令。我也一直在玩复杂的awk和sed,但我觉得这太简单了,对有经验的人来说不需要太难 所需结果: 如果height~

我有一个文件,我们把它叫做
input.txt
。它有许多行,但唯一相关的行包含一个模型语句

身高~mu性别

它还可能包含:

高度!n~mu date_出生!r g

因此,在正则表达式中标识行的一致性因子是
^height.*.*.$
。 至少到目前为止,这是我设计的

我想附加
!只有在
的情况下,才将r g
移动到结束行!r g
尚未出现。我试着把答案和,和混在一起,但我想不出来。我更喜欢单一命令。我也一直在玩复杂的
awk
sed
,但我觉得这太简单了,对有经验的人来说不需要太难

所需结果:

如果
height~mu-gender
那么
height~mu-gender!r g

如果<代码>高度!bin~mu date_出生!r g那么什么都不需要发生

如果<代码>高度!bin~mu性别然后
身高!彬~穆性别!r g

编辑:

到目前为止我试过了

sed'/^height.*.~!r、 *$/!s/$/!如果
,r g/'input.txt将正确跳过行!g
存在,但将其附加到
input.txt
中的每一行

sed'/^height.$/s/$/!r g/'input.txt
,仅正确地附加到匹配行,如果
,也正确地附加到匹配行!r g
已存在

sed '/^y.*~.*$/{/!r g/!{s/.*/& !r g/}}' input.txt
例如


更新

上面的代码> SED命令将考虑所有的模式:代码< >代码> y****$<代码>,并附上<代码>!仅当该行不包含

时,才返回到末尾!r g
在线路的任何部分

要更改筛选的行,只需将起始正则表达式
^y.*.*.$
更新为所需内容

例如


更新

上面的代码> SED命令将考虑所有的模式:代码< >代码> y****$<代码>,并附上<代码>!仅当该行不包含

时,才返回到末尾!r g
在线路的任何部分

要更改筛选的行,只需将起始正则表达式更新为所需的内容。

awk解决方案:

awk '/^y.*~.+/ && !/!r g/{ $0=$0" !r g" }1' input.txt
awk解决方案:

awk '/^y.*~.+/ && !/!r g/{ $0=$0" !r g" }1' input.txt
awk中的另一个:

$ awk '{sub(/( !r g)?\r?$/," !r g")}1' file
y ~ a b c !r g
y !n ~ d e f !r g
y !n ~ d e f !r g
或使用更改的数据:

height ~ mu gender !r g
height !bin ~ mu date_birth !r g
height !bin ~ mu gender !r g
请注意正则表达式中的
\r?
,它是Windows行结尾
\r\n
的第一部分。如果它存在,则会被替换。

awk中的另一个:

$ awk '{sub(/( !r g)?\r?$/," !r g")}1' file
y ~ a b c !r g
y !n ~ d e f !r g
y !n ~ d e f !r g
或使用更改的数据:

height ~ mu gender !r g
height !bin ~ mu date_birth !r g
height !bin ~ mu gender !r g

请注意正则表达式中的
\r?
,它是Windows行结尾
\r\n
的第一部分。如果它存在,它就会被替换。

我们可以用sed来实现这一点。首先,我们选择以
高度开始并包含
~
的行。有了这些行,我们可以用
替换行的结尾!r g
如果该行尚未以该值结束:

#/usr/bin/sed-f
/^高度*~/{
/!r g$/!s/$/!r g/
#说明:
#/!r g/:选择带有标记的行
#!s:在不匹配的行中,替换
#$:行尾
#!r g:要添加的标记
}
示范
$./45876917.sed我们可以用sed来实现这一点。首先,我们选择以
高度开始并包含
~
的行。有了这些行,我们可以用
替换行的结尾!r g
如果该行尚未以该值结束:

#/usr/bin/sed-f
/^高度*~/{
/!r g$/!s/$/!r g/
#说明:
#/!r g/:选择带有标记的行
#!s:在不匹配的行中,替换
#$:行尾
#!r g:要添加的标记
}
示范
$./45876917.sed这不是我想要的。它添加了
!r g
到行首。最后我需要它。也许这还不清楚。让我编辑我的原始帖子。@tstev,如果您需要在
之前留一个空格!r g
,只需更改替换字符串,
&!r g
进入
&!r g
@tstev您能否简单地显示一个非工作输入和预期输出。我使用了您建议的模式来过滤掉所需的行。似乎主要模式需要改进。如果你能清楚地说明问题,我可以帮你。我更新了问题陈述。我不知道如何把它说得更清楚。@tstev所以你只需要用你建议的新正则表达式来更改起始正则表达式。尝试
sed'/^height.*.*$/{/!rg/!{s/*/&!rg/}}input.txt
。或者您想允许任何字符串代替
高度
?这不是我想要的。它添加了
!r g
到行首。最后我需要它。也许这还不清楚。让我编辑我的原始帖子。@tstev,如果您需要在
之前留一个空格!r g
,只需更改替换字符串,
&!r g
进入
&!r g
@tstev您能否简单地显示一个非工作输入和预期输出。我使用了您建议的模式来过滤掉所需的行。似乎主要模式需要改进。如果你能清楚地说明问题,我可以帮你。我更新了问题陈述。我不知道如何把它说得更清楚。@tstev所以你只需要用你建议的新正则表达式来更改起始正则表达式。尝试
sed'/^height.*.*$/{/!rg/!{s/*/&!rg/}}input.txt
。或者您想允许任何字符串代替
高度
?您写道:If
y!n~def!r
那么什么都不需要发生。这与您之前附加
的要求相矛盾!只有在
的情况下,才将r g
移动到结束行!r g
还没有present@RomanPerekhrest,谢谢忘了
g
。相应地编辑了它。我编辑了文章,使输入看起来更像我的实际脚本。你写了:If
y!n~def!r
然后