sed匹配模式后有条件地追加到行

时间:2019-04-11 13:38:55

标签: bash shell unix awk sed

我有一个文件(测试),其中包含以下内容,需要编辑。

测试

foo:
bar:hello

我目前正在使用sed来匹配模式并将字符串附加到行尾。

sed -ie "/^bar/ s/$/,there" test

哪个给了我期望的输出,即

foo:
bar:hello,there

但是问题是,当行不以:结尾时,逗号(,)应该存在。否则它将变成:

sed -ie "/^foo/ s/$/,there" test

输出:

foo:,there
bar:hello

要求:

foo:there
bar:hello

因此,可以通过任何方式检查模式,在匹配检查行的最后一个字符之后,根据最后一个字符,在该行的末尾附加一个字符串。

P.S .:我无法安装单独的软件包。

4 个答案:

答案 0 :(得分:3)

这是在成功替换后使用t从第二条s///命令分支的一种方法:

$ cat test
foo:
bar:
bar:hello
bar:
bar:hello
bar:
bar:hello

$ sed '/^bar/ {s/:$/:there/;t;s/$/, there/}' test 
foo:
bar:there
bar:hello, there
bar:there
bar:hello, there
bar:there
bar:hello, there

答案 1 :(得分:3)

保持简单,只需使用awk:

kCMTimeZero

请注意所有原始字符串(func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) { let videoAsset = AVURLAsset(url: outputFileURL) let imageGenerator = AVAssetImageGenerator(asset: videoAsset) imageGenerator.appliesPreferredTrackTransform = true imageGenerator.requestedTimeToleranceBefore = kCMTimeZero imageGenerator.requestedTimeToleranceAfter = kCMTimeZero let time = CMTime(seconds: videoAsset.duration.seconds - durationToCheck, preferredTimescale: videoAsset.duration.timescale) var cgImage: CGImage? do { cgImage = try imageGenerator.copyCGImage(at: time, actualTime: nil) } catch { print("Error generating image with error: \(error.localizedDescription)") } } $ awk '/^foo/{$0 = $0 (/:$/ ? "" : ",") "there"} 1' file foo:there bar:hello $ awk '/^bar/{$0 = $0 (/:$/ ? "" : ",") "there"} 1' file foo: bar:hello,there ),foobar:和替换文本如何( ,)仅指定一次?那就是您要在软件中实现的目标-减少冗余。

以上内容可在任何UNIX盒中的任何shell中使用任何awk进行工作。

答案 2 :(得分:2)

sed命令前面的模式是您的条件。您应该注意,可以为sed指定多个-e命令。

这又是您的代码,但是我忽略了foo和bar。我只注意最后一个字符:

sed -i -e '/[^:]$/s/$/,there/' -e '/:$/s/$/there/' test

/ [^:] $ /是任何在行尾不是冒号的字符。 /:$ /是补码(以冒号结尾的任何行)。

以下是结果:

$ sed  -e '/[^:]$/s/$/,there/' -e '/:$/s/$/there/' test
foo:there
bar:hello,there

答案 3 :(得分:0)

为两者尝试gnu sed,

sed -E '/^(foo|bar)/ s/:$/&there/;n; s/[^:]$/&,there/' test