给定一个包含双引号的字符串(或包含类似字符串的文本行),其中一些双引号前面有反斜杠,sed 替换前面没有反斜杠的双引号的最佳方法是什么与其他字符或字符串?
original string 'Abc \"NN""xyz\"ddd"ee "ff" \"QQ\"' replace non backslash double-quote with percent symbol new string 'Abc \"NN%%xyz\"ddd%ee %ff% \"QQ\"' 到目前为止,我发现执行此操作的唯一方法是首先将“反斜杠双引号”组合替换为文本中从未找到且与替换字符或字符串不同的某些唯一字符或字符串,然后替换双引号用所需的替换引号(例如反斜杠双引号,或者为了清楚起见,在本例中使用百分号),然后将唯一的保持字符串更改回其原始反斜杠双引号。因此,该方法需要调用 3 次 sed。 那么有没有更简单的方法来使用 sed 来做到这一点? 使用GNUsed $ sed -E ':a;s/(\\")([^\]*)"/\1\2%/;ta' input_file 'Abc \"NN%%xyz\"ddd%ee %ff% \"QQ\"' sed -e 's/[\]"/%/g' -e 'y/"%/%"/' -e 's/"/\\"/g' 这首先将每次出现的 替换\"为%。然后它会全部交换%,"反之亦然。最后,所有剩余的双引号都被转义。 如果字符串%从一开始就不包含任何内容,那么效果是所有未转义的双引号都被替换为%。 或者,但使用额外的字符 ,@该字符从一开始就不能出现在数据中: sed -e 's/[\]"/@/g' -e 'y/"/%/' -e 's/@/\\"/g' 这个变体更清楚地显示了发生的情况,也是您在问题中提出的建议(sed尽管仅使用一次调用):在我们转动未转义的双引号时,我们暂时“隐藏”转义的双引号进入%。完成后,我们恢复它们。 利用流编辑器-E|-r的扩展正则表达式功能 ( ) GNU sed。 问题是检测一个引号字符,该字符在其前面看到偶数个(零也是偶数)反斜杠,然后是非反斜杠字符或行首。 该报价被转换为百分比符号。 双引号的版本。 sed -E -f - <<\eof file :a;s/((^|[^\])([\][\])*)"/\1%/g;ta 单引号版本。 sed -E -f - <<\eof file :a;s/((^|[^\])([\][\])*)'/\1%/g;ta 在 VMware Workstation v10.0.2 上作为客户操作系统安装的 Linux 操作系统不显示所有分区,就像安装在物理 HP 服务器上时一样 在 Ubuntu 上安装 Postfix 和 Dovecot 邮件服务器,但 Postfix 无法启动 将动画 .gif 设置为 Windows 7 上的桌面背景 如何将我的参考书目设为附录? “根磁盘不存在” - 我该如何恢复它? 重启后 wifi 无法使用。Windows 10 和 Ubuntu 16.04 双启动系统 Ubuntu 22.04 中文(简体)拼音输入支持 键盘映射停止工作——如何调试? 对齐浮动到中心的方程式 如何退出全屏模式?
到目前为止,我发现执行此操作的唯一方法是首先将“反斜杠双引号”组合替换为文本中从未找到且与替换字符或字符串不同的某些唯一字符或字符串,然后替换双引号用所需的替换引号(例如反斜杠双引号,或者为了清楚起见,在本例中使用百分号),然后将唯一的保持字符串更改回其原始反斜杠双引号。因此,该方法需要调用 3 次 sed。
那么有没有更简单的方法来使用 sed 来做到这一点?
使用GNUsed
sed
$ sed -E ':a;s/(\\")([^\]*)"/\1\2%/;ta' input_file 'Abc \"NN%%xyz\"ddd%ee %ff% \"QQ\"' sed -e 's/[\]"/%/g' -e 'y/"%/%"/' -e 's/"/\\"/g' 这首先将每次出现的 替换\"为%。然后它会全部交换%,"反之亦然。最后,所有剩余的双引号都被转义。 如果字符串%从一开始就不包含任何内容,那么效果是所有未转义的双引号都被替换为%。 或者,但使用额外的字符 ,@该字符从一开始就不能出现在数据中: sed -e 's/[\]"/@/g' -e 'y/"/%/' -e 's/@/\\"/g' 这个变体更清楚地显示了发生的情况,也是您在问题中提出的建议(sed尽管仅使用一次调用):在我们转动未转义的双引号时,我们暂时“隐藏”转义的双引号进入%。完成后,我们恢复它们。 利用流编辑器-E|-r的扩展正则表达式功能 ( ) GNU sed。 问题是检测一个引号字符,该字符在其前面看到偶数个(零也是偶数)反斜杠,然后是非反斜杠字符或行首。 该报价被转换为百分比符号。 双引号的版本。 sed -E -f - <<\eof file :a;s/((^|[^\])([\][\])*)"/\1%/g;ta 单引号版本。 sed -E -f - <<\eof file :a;s/((^|[^\])([\][\])*)'/\1%/g;ta 在 VMware Workstation v10.0.2 上作为客户操作系统安装的 Linux 操作系统不显示所有分区,就像安装在物理 HP 服务器上时一样 在 Ubuntu 上安装 Postfix 和 Dovecot 邮件服务器,但 Postfix 无法启动 将动画 .gif 设置为 Windows 7 上的桌面背景 如何将我的参考书目设为附录? “根磁盘不存在” - 我该如何恢复它? 重启后 wifi 无法使用。Windows 10 和 Ubuntu 16.04 双启动系统 Ubuntu 22.04 中文(简体)拼音输入支持 键盘映射停止工作——如何调试? 对齐浮动到中心的方程式 如何退出全屏模式?
sed -e 's/[\]"/%/g' -e 'y/"%/%"/' -e 's/"/\\"/g' 这首先将每次出现的 替换\"为%。然后它会全部交换%,"反之亦然。最后,所有剩余的双引号都被转义。 如果字符串%从一开始就不包含任何内容,那么效果是所有未转义的双引号都被替换为%。 或者,但使用额外的字符 ,@该字符从一开始就不能出现在数据中: sed -e 's/[\]"/@/g' -e 'y/"/%/' -e 's/@/\\"/g' 这个变体更清楚地显示了发生的情况,也是您在问题中提出的建议(sed尽管仅使用一次调用):在我们转动未转义的双引号时,我们暂时“隐藏”转义的双引号进入%。完成后,我们恢复它们。 利用流编辑器-E|-r的扩展正则表达式功能 ( ) GNU sed。 问题是检测一个引号字符,该字符在其前面看到偶数个(零也是偶数)反斜杠,然后是非反斜杠字符或行首。 该报价被转换为百分比符号。 双引号的版本。 sed -E -f - <<\eof file :a;s/((^|[^\])([\][\])*)"/\1%/g;ta 单引号版本。 sed -E -f - <<\eof file :a;s/((^|[^\])([\][\])*)'/\1%/g;ta 在 VMware Workstation v10.0.2 上作为客户操作系统安装的 Linux 操作系统不显示所有分区,就像安装在物理 HP 服务器上时一样 在 Ubuntu 上安装 Postfix 和 Dovecot 邮件服务器,但 Postfix 无法启动 将动画 .gif 设置为 Windows 7 上的桌面背景 如何将我的参考书目设为附录? “根磁盘不存在” - 我该如何恢复它? 重启后 wifi 无法使用。Windows 10 和 Ubuntu 16.04 双启动系统 Ubuntu 22.04 中文(简体)拼音输入支持 键盘映射停止工作——如何调试? 对齐浮动到中心的方程式 如何退出全屏模式?
这首先将每次出现的 替换\"为%。然后它会全部交换%,"反之亦然。最后,所有剩余的双引号都被转义。
\"
%
"
如果字符串%从一开始就不包含任何内容,那么效果是所有未转义的双引号都被替换为%。
或者,但使用额外的字符 ,@该字符从一开始就不能出现在数据中:
@
sed -e 's/[\]"/@/g' -e 'y/"/%/' -e 's/@/\\"/g' 这个变体更清楚地显示了发生的情况,也是您在问题中提出的建议(sed尽管仅使用一次调用):在我们转动未转义的双引号时,我们暂时“隐藏”转义的双引号进入%。完成后,我们恢复它们。 利用流编辑器-E|-r的扩展正则表达式功能 ( ) GNU sed。 问题是检测一个引号字符,该字符在其前面看到偶数个(零也是偶数)反斜杠,然后是非反斜杠字符或行首。 该报价被转换为百分比符号。 双引号的版本。 sed -E -f - <<\eof file :a;s/((^|[^\])([\][\])*)"/\1%/g;ta 单引号版本。 sed -E -f - <<\eof file :a;s/((^|[^\])([\][\])*)'/\1%/g;ta 在 VMware Workstation v10.0.2 上作为客户操作系统安装的 Linux 操作系统不显示所有分区,就像安装在物理 HP 服务器上时一样 在 Ubuntu 上安装 Postfix 和 Dovecot 邮件服务器,但 Postfix 无法启动 将动画 .gif 设置为 Windows 7 上的桌面背景 如何将我的参考书目设为附录? “根磁盘不存在” - 我该如何恢复它? 重启后 wifi 无法使用。Windows 10 和 Ubuntu 16.04 双启动系统 Ubuntu 22.04 中文(简体)拼音输入支持 键盘映射停止工作——如何调试? 对齐浮动到中心的方程式 如何退出全屏模式?
这个变体更清楚地显示了发生的情况,也是您在问题中提出的建议(sed尽管仅使用一次调用):在我们转动未转义的双引号时,我们暂时“隐藏”转义的双引号进入%。完成后,我们恢复它们。
利用流编辑器-E|-r的扩展正则表达式功能 ( ) GNU sed。
-E|-r
GNU sed
问题是检测一个引号字符,该字符在其前面看到偶数个(零也是偶数)反斜杠,然后是非反斜杠字符或行首。
该报价被转换为百分比符号。
双引号的版本。
sed -E -f - <<\eof file :a;s/((^|[^\])([\][\])*)"/\1%/g;ta 单引号版本。 sed -E -f - <<\eof file :a;s/((^|[^\])([\][\])*)'/\1%/g;ta 在 VMware Workstation v10.0.2 上作为客户操作系统安装的 Linux 操作系统不显示所有分区,就像安装在物理 HP 服务器上时一样 在 Ubuntu 上安装 Postfix 和 Dovecot 邮件服务器,但 Postfix 无法启动 将动画 .gif 设置为 Windows 7 上的桌面背景 如何将我的参考书目设为附录? “根磁盘不存在” - 我该如何恢复它? 重启后 wifi 无法使用。Windows 10 和 Ubuntu 16.04 双启动系统 Ubuntu 22.04 中文(简体)拼音输入支持 键盘映射停止工作——如何调试? 对齐浮动到中心的方程式 如何退出全屏模式?
单引号版本。
sed -E -f - <<\eof file :a;s/((^|[^\])([\][\])*)'/\1%/g;ta 在 VMware Workstation v10.0.2 上作为客户操作系统安装的 Linux 操作系统不显示所有分区,就像安装在物理 HP 服务器上时一样 在 Ubuntu 上安装 Postfix 和 Dovecot 邮件服务器,但 Postfix 无法启动 将动画 .gif 设置为 Windows 7 上的桌面背景 如何将我的参考书目设为附录? “根磁盘不存在” - 我该如何恢复它? 重启后 wifi 无法使用。Windows 10 和 Ubuntu 16.04 双启动系统 Ubuntu 22.04 中文(简体)拼音输入支持 键盘映射停止工作——如何调试? 对齐浮动到中心的方程式 如何退出全屏模式?