regex - 如何使用 sed/awk/perl 将匹配的模式替换为等效数量的破折号?

标签 regex sed scripting escaping ksh

我想在文件中搜索所有出现的模式,并将匹配项替换为等效数量的填充,例如空格或破折号。重要的是要注意 我不想更改文件! 我想将结果打印为标准输出。这就是为什么我更喜欢使用 sed。输出应该与文件的长度相同,因为我想用破折号中的模式长度替换正则表达式找到的每个模式。 示例:假设文件包含以下内容:

data | more data | "to be dashed"

期望的输出:

data | more data | --------------

我目前有这样的事情:

sed -e 's/["][^"]*["]/-/g' file

结果是:

data | more data | -

有什么想法吗?

最佳答案

使用 Perl:

perl -pe 's/(".*?")/ "-" x length($1) /ge' <<END
data | more data | "to be dashed"
data | "more data" | "multi words " "to be dashed"
END
data | more data | --------------
data | ----------- | -------------- --------------

由于需要找到匹配文本的字符串长度,因此需要通过一轮评估运行s///的替换部分,因此e 旗帜。

关于regex - 如何使用 sed/awk/perl 将匹配的模式替换为等效数量的破折号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24786079/

相关文章:

bash - 使用 sed 命令解析资源 Visual Studio .rc 文件

awk - 如果段落包含存储在变量中的字符串,则打印该段落(空行分隔段落)

powershell - 如何在不破坏主脚本的情况下用Ctrl + C停止子进程并将子输出流传输到PowerShell中的主脚本?

jQuery 使用一个 .js 文件实现不同页面的不同操作

regex - REGEXP TCL 中的多个捕获组

javascript - 在 javascript 中使用 PHP 生成 JSON : issues with backslashes

C++:检查字符串是否是有效的 MD5 十六进制哈希

regex - 删除批处理或 PoSh 的引号之间的逗号

linux - 重击 : Loop a file until it reaches specific number of matching strings and start over

linux - 如何搜索 XX,如果找到,则在下一行中搜索 YY?