使用 sed 查找和替换复杂字符串

使用 sed 查找和替换复杂字符串

我有一个大文件,其中包含“xyz.abc.001.xxx.0.820”等字符串,我想将其替换为总文件中的“0,820,xyz.abc.001.xxx”。

例子:

xyz.abc.001.xxx.0.820\ to 0,820,xyz.abc.001.xxx 
xyz.abc.001.xxx.820.123\ to 820,123,xyz.abc.001.xxx
xyz.abc.001.xxx.1000.2000\ to 1000,2000,xyz.abc.001.xxx 
xyz.abc.001.xxx.1.100\ to 1,100,xyz.abc.001.xxx 

我正在使用下面的 sed 命令和正则表达式,但没有正确替换

sed -E "s/(xyz.abc[0-9]\+\.xxx)\.([0-9]\+)\.([0-9]\+)\\/\2,\3,\1/g" file_name

有可能这样做吗?

提前致谢。

答案1

尝试一下

sed -E "s/(xyz.abc.*xxx).([0-9]+)\.([0-9]+)./\2,\3,\1/" 
sed -E "s/(xyz.abc.*xxx).([0-9]+)\.([0-9]+)\\\\/\2,\3,\1/" 

在哪里

  • 模式选择由\( ... \)
  • 尾随可以通过(任何字符)或(从 shell 转义并从 sed 转义)\捕获.\\\\
  • 注意我使用.\.来指定一个点

答案2

现在无法尝试,但对我来说看起来并没有太大问题。\+不符合标准,所以尝试

sed -E "s/(xyz\.abc[0-9]{1,}\.xxx)\.([0-9]{1,})\.([0-9]{1,})\\/\2:\3,\1/g" file_name

答案3

如果不是必须的sed,您可以尝试以下awk基于的解决方案:

awk -F. -v OFS="." '{sub(/\\$/,"",$NF); printf("%s,%s,",$NF,$(NF-1)); NF=NF-2}1' input.txt

这会将每一行解释为.- 分隔的字段,去除最后一行的尾随\,并在输出行的开头打印以逗号分隔的最后两个字段,后面是其余字段(再次.- 分隔)。

相关内容