我有一个名为 Sample.text 的文本文件,如下所示
Continent Lat/Lon: 46.07305 / -100.546
Country Lat/Lon: 38 / -98
City Lat/Lon:(37.3845) / (-122.0881)
我想处理此文本以获得如下输出,而不使用临时文件
Continent Lat/Lon: 46.07305 / -100.546
Country Lat/Lon: 38 / -98
City Latitude: (37.3845)
City Longitude: (-122.0881)
我无法控制纬度/经度的值。
我使用 2 个 awk 脚本完成了这个任务
BEGIN { FS=":"} {print $2} | BEGIN { FS="/"} {printf "City Latitude:%s\nCity Longitude:%s\n",$1,$2}
由于我想写入原始文件,有什么方法可以使用
sed -i
所有的投入都会受到赞赏。
答案1
sed -i 's,^City Lat/Lon:(\(.*\)) / (\(.*\))$,City Latitude: (\1)\nCity Longitude: (\2),' /path/to/file
解释
sed -i 's,foo,bar,' /path/to/file
: 就地sed
执行,替换foo
为bar
.注意,我在这里使用,
作为分隔符而不是/
,这样我就可以/
在字符串中使用而不必转义它们。^City Lat/Lon:(\(.*\)) / (\(.*\))$
:找到此正则表达式的任何出现位置,其中^
和$
分别是行的开头和结尾,并且两者中的每一个\(.*\)
代表一个捕获组。City Latitude: (\1)\nCity Longitude: (\2)
:替换为该字符串,其中\1
和\2
表示从第一个表达式捕获的组,并且\n
是换行符。
答案2
有了sed -i
,就可以进行真正的就地编辑不可能,因为在幕后它实际上正在为您创建一个临时文件。
但是,您可以将结果存储在某个地方,然后将其写入文件。一个简单的方法是使用 bash 变量。
只要确保您的文件不太大即可。对于大多数文件来说应该没问题,但如果您有69 GB
日志文件,则可以将其写入/tmp/
。
改变
sed -i '<some regex>' --any-flags-you-want /some/file
到
SED_RESULT=$(sed '<some regex>' --any-flags-you-want) && echo ${SED_RESULT} > /some/file