在输入和输出中使用通配符将文本替换为 SED

Replacing Text With SED Using a Wildcard in the Input and The Output

提问人:Adam James Dietrick 提问时间:11/9/2023 更新时间:11/9/2023 访问量:56

问:

我正在尝试清理一些数据,但我有一个日期和时间一起运行的区域。理想情况下,以下是我想做的任何示例。当然,有两位数的日期,但不会有两位数的小时数。日期前也总是有一个前导空格。

所以变成了Nov 86:00Nov 8, 6:00

我想对 8 和 6 都使用通配符,但我没有弄清楚如何正确处理。这是我所拥有的:

sed -i 's/ *:/I DONT KNOW WHAT TO DO HERE/g' /tmp/showtimes.raw
Linux Bash SED

评论


答:

0赞 choroba 11/9/2023 #1

您需要括号来介绍捕获组。它们从左边开始编号。使用带有数字的反斜杠来引用它们:

sed 's/\( [0-9][0-9]\?\)\([0-9]:\)/\1, \2/'
         ~~~~~~~~~~~~~    ~~~~~~
         Capture group    Capt.g.
              #1            #2

评论

0赞 Adam James Dietrick 11/10/2023
谢谢,明天当我回到那台电脑时,我会尝试一下。
0赞 Adam James Dietrick 11/10/2023
这很有效,谢谢。这就是我如何调整它以在我的脚本中工作。sed -i 's/( [0-9][0-9]\?)([0-9]:)/\1, \2/' /tmp/放映次数.raw
1赞 HatLess 11/11/2023
如果您发现某个答案有用,请接受它作为答案,而不是说谢谢。
0赞 Adam James Dietrick 11/11/2023
我正在尝试类似的替换,如果它们继续一个数字并用一个空格和相同的数字替换,则基本上删除两个空格。我收到此错误:sed:-e expression #1,char 17:未终止请帮忙sed -i 's/( [0-9]\?)/ \1' /tmp/showtimes.raw
0赞 choroba 11/11/2023
@AdamJamesDietrick:提出一个新问题,提出一个新问题。
0赞 Cyrus 11/9/2023 #2

这应该可以完成 GNU 的工作,如果正如你所写的,小时数只有一个数字。sed

echo 'Nov 86:00' | sed -E 's/(.*)(....)$/\1, \2/'

输出:

Nov 8, 6:00

评论

0赞 Adam James Dietrick 11/10/2023
谢谢,明天当我回到那台电脑时,我会尝试一下。
0赞 Adam James Dietrick 11/10/2023
在命令行中工作得很好,但是当我将其调整到我的脚本时,它会发回一个关于 3 的错误。另一个建议的代码(由 choroba 提供)有效。知道为什么没有吗?sed -i -E 's/(.*)(....)$/\1, \2/' /tmp/showtimes.raw