我有一个大文件,其中包含“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
这会将每一行解释为.
- 分隔的字段,去除最后一行的尾随\
,并在输出行的开头打印以逗号分隔的最后两个字段,后面是其余字段(再次.
- 分隔)。