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

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

我有一个名为 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执行,替换foobar.注意,我在这里使用,作为分隔符而不是/,这样我就可以/在字符串中使用而不必转义它们。
  • ^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

相关内容