我尝试了许多不同的组合但没有成功,此时我将非常感谢您的帮助。
我需要多次替换该行的这一端(大约 300 次),而且一一替换会很痛苦:
:;XXXXXX (lenght may vary)
我能够找到它,:;*$
其中突出显示了我所需要的!但我无法替换它,使其看起来像这样::;XXXXXX;;;
*
- 应该匹配任何东西(确实如此)
$
- 应该匹配行尾(确实如此)
我尝试过将其封装*
在括号中(*); [*]
......就像:;(*);;;$
其他事情一样,但无济于事。当然会进行替换,但形式与输入相同。例如......而不是:;XXXXXX;;;
我得到:;*;;;
- 这是我能从中得到的最好的结果。
这是UltraEdit正则表达式格式,但是这个软件也可以处理Unix和Perl正则表达式。
我你可以建议任何方法来做到这一点,我会尝试一下(终端,其他软件等)。
编辑:
我正在尝试从旧诺基亚到新诺基亚(s30+ 系列)的联系人。只有 backup.nbu 我从中获得了 .vcf 联系人。我已通过 .txt 将它们放入一个文件中cat *.vcf > combined.vcf
。我找到了 Excel 宏和 PHP 脚本,它们本应完成整个过程,但它们不起作用 - 但我想所有这些都不是那么相关。之后我发现了这个特定模型可以处理的 Vcard 格式。现在我正在尝试修改它,使其看起来相同。更换线条没问题,但我需要编辑末端。;:NAME
不;:NAME;;;
修改名称...
我尝试了上面描述的方法。之后我尝试了建议sed -ri "s/\:\;X+$/&\;\;\;/g"
。
我确信 DOS 线路末端可能是问题所在,所以我运行:sed -i 's/\r//g' combined.vcf
然后再次运行建议的 sid 命令。
从:N;CHARSET=UTF-8;ENCODING=8BIT:ALFA
到:N;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:;ALFA;;;
编辑2:
所以我从头开始...
我合并了 .vcf 文件
在 UltraEdit 中打开它们并保存为 LF (来自 CRLF) - 这次尝试没有
sed
终端在查找替换中我选择了 Perl Regex
寻找
(:;)(.*)
代替
\1\2;;;
供参考:.*
- 匹配零个或多个任何字符(换行符除外)...
完毕!
答案1
您需要的称为反向引用。它的意思是 ”将比赛中选择的任何内容放在这里” 并通过以下方式发挥作用:
- 在匹配的正则表达式中使用括号来选择字符串的一部分,
- 使用编号的反向引用(
\1
对于第一个括号,\2
对于第二个括号,等等)。
sed
支持这一点,这会产生以下命令(sed
需要转义括号,但对于其他基于正则表达式的软件可能不是这种情况):
sed -i 's/^\(:;.*\)$/\1;;;/' combined.vcf
答案2
使用sed
它可以像这样完成:
echo ":;XXXXXX" | sed -re "s/\:\;X+$/&\;\;\;/g"
当您从某个文件中获取数据时,您可以使用以下命令直接在文件内编辑它:
sed -ri "s/\:\;X+$/&\;\;\;/g" file.txt