在不使用带有 SED 的临时文件的情况下查找并替换文件中的字符串

Swa*_*are 5 sed shell-script text-processing

我有一个名为 sample.text 的文本文件,它看起来像这样

Continent Lat/Lon: 46.07305 / -100.546
Country Lat/Lon: 38 / -98
City Lat/Lon:(37.3845) / (-122.0881)
Run Code Online (Sandbox Code Playgroud)

我想处理此文本以在不使用临时文件的情况下获得如下输出

Continent Lat/Lon: 46.07305 / -100.546
Country Lat/Lon: 38 / -98
City Latitude: (37.3845) 
City Longitude: (-122.0881)
Run Code Online (Sandbox Code Playgroud)

我无法控制纬度/经度的值。

我已经使用 2 个 awk 脚本完成了这项工作

BEGIN { FS=":"}  {print $2} | BEGIN { FS="/"}  {printf "City Latitude:%s\nCity Longitude:%s\n",$1,$2} 
Run Code Online (Sandbox Code Playgroud)

因为我想写原始文件,有什么方法可以使用

sed -i  
Run Code Online (Sandbox Code Playgroud)

感谢所有输入。

Spa*_*awk 2

sed -i 's,^City Lat/Lon:(\(.*\)) / (\(.*\))$,City Latitude: (\1)\nCity Longitude: (\2),' /path/to/file
Run Code Online (Sandbox Code Playgroud)

解释

  • sed -i 's,foo,bar,' /path/to/file:sed就地执行,替换foo为bar. 注意,我在这里使用,作为分隔符而不是/,这样我就可以/在字符串中使用而不必转义它们。
  • ^City Lat/Lon:(\(.*\)) / (\(.*\))$:找到此正则表达式的任何出现位置,其中^和$分别是行的开头和结尾,并且两者中的每一个\(.*\)代表一个捕获组。
  • City Latitude: (\1)\nCity Longitude: (\2):替换为该字符串,其中\1和\2表示从第一个表达式捕获的组,并且\n是换行符。