Gab*_*iel 5 perl awk sed pattern-matching
我想使用sed或任何命令行工具来通过 shell 命令的输出替换部分行。例如:
datesed似乎最合适,因为它也允许匹配模式并重新格式化其他内容,例如移动匹配的位,但这不是强制性的。
这是一个简化的示例:
echo "timestamp = 1234567890" | sed "s/timestamp = \(.*\)/timestamp = $(date -u --d @\1 "+%Y-%m-%d %T")/g"
Run Code Online (Sandbox Code Playgroud)
当然,这$(...)件事是行不通的。据我了解,这是针对环境变量的。
那么正确的语法是什么?在这种情况下是否sed推荐?我花了几个小时搜索...sed甚至有能力这样做吗?还有其他更适合的工具吗?
编辑
我需要...
awk '{$3...要运行外部命令,sed您需要使用e. 看一个例子:
$ echo "timestamp = 1234567890" | sed "s#timestamp = \(.*\)#date -u --d @\1 "\+\%Y"#e"
2009
Run Code Online (Sandbox Code Playgroud)
完整格式:
$ sed "s#timestamp = \(.*\)#echo timestamp; date -u --d @\1 '\+\%Y-\%m-\%d \%T'#e" <<< "timestamp = 1234567890"
timestamp
2009-02-13 23:31:30
Run Code Online (Sandbox Code Playgroud)
这会捕获时间戳并将其转换为+%Y格式。
从man sed:
e
该命令允许将 shell 命令的输入通过管道传送到模式空间。如果进行了替换,则执行在模式空间中找到的命令,并用其输出替换模式空间。尾随换行符被抑制;如果要执行的命令包含 null 字符,则结果未定义。这是一个 GNU sed 扩展。
不过,你看它有点“丑”。根据你想要做什么,你最好使用常规while循环来获取值,然后date正常使用。例如,如果文件如下:
timestamp = 1234567890
Run Code Online (Sandbox Code Playgroud)
然后你可以说:
while IFS="=" read -r a b
do
echo "$b"
done < file
Run Code Online (Sandbox Code Playgroud)
这将使您拥有$b时间戳,然后您可以执行date ....