我有一个文件(测试),其中包含以下内容,需要编辑。
测试
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 .:我无法安装单独的软件包。
答案 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
),foo
,bar
,:
和替换文本如何( ,
)仅指定一次?那就是您要在软件中实现的目标-减少冗余。
以上内容可在任何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