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
。或者您想允许任何字符串代替高度
?您写道:Ify!n~def!r
那么什么都不需要发生。这与您之前附加的要求相矛盾!只有在的情况下,才将r g
移动到结束行!r g
还没有present@RomanPerekhrest,谢谢忘了g
。相应地编辑了它。我编辑了文章,使输入看起来更像我的实际脚本。你写了:Ify!n~def!r
然后