【问题标题】:Replace First Occurrence Only of Pipe Character in String仅替换字符串中管道字符的第一次出现
【发布时间】:2021-04-17 15:50:00
【问题描述】:

我需要在带有 sed 的管道分隔的 csv 文件的标题行末尾删除一个额外的管道字符。我试图找到的文字字符串是 COLNAME|

在 GCP Windows 服务器上工作。我正在尝试使用的命令:

"C:\Program Files (x86)\GnuWin32\bin\sed.exe" sed '0,/COLNAME"|"/s//COLNAME/'文件名

返回输出... sed.exe: -e expression #1, char 3: unterminated `s' command

我是 sed 的新手,使用 s 命令已经有一段时间了,但似乎无法获得正确的语法。

关于如何完成此任务的任何建议?

【问题讨论】:

  • 那么,您想在某个文件中查找COLNAME"|" 并将其替换为COLNAME,对吧?
  • 我要替换的文字字符串是 COLNAME| " 双引号在我试图运行的命令中的管道周围,因为我读到特殊字符需要用双引号括起来

标签: windows google-cloud-platform sed gnu-sed


【解决方案1】:

如果你想在 Windows 中用COLNAME"|" 替换COLNAME|,使用GNU sed,你可以使用

"C:\Program Files (x86)\GnuWin32\bin\sed.exe" "s/COLNAME|/COLNAME"^""|"^""/g"

这里,COLNAME| 匹配 COLNAME| 和 COLNAME"^""|"^"" 形成文字 COLNAME"|" 替换,因为 COLNAME" 结束引用的字符串,^" 将文字 " 字符附加到 sed 命令,"|"将 | 字符附加到 sed 命令,然后 ^" 将另一个文字 " 附加到 sed 命令,然后下一个 " 开始完成部分。 g 标志使其匹配并替换所有匹配项。

如果您想在 Windows 中将 COLNAME"|" 替换为 COLNAME,使用 GNU sed,您可以使用

"C:\Program Files (x86)\GnuWin32\bin\sed.exe" "s/COLNAME"^""|"^""/COLNAME/g" FILENAME
"C:\Program Files (x86)\GnuWin32\bin\sed.exe" "s/COLNAME\x22|\x22/COLNAME/g" FILENAME
"C:\Program Files (x86)\GnuWin32\bin\sed.exe" "s/COLNAME\d34|\d34/COLNAME/g" FILENAME

请注意,您需要用双引号将替换命令括起来并匹配双引号,您不能简单地使用" 或\",您可以将其与转义的^" 匹配,或者\x22,字符的十六进制表示,或\d34。

请注意,在"s/COLNAME"^""|"^""/COLNAME/g" 中,sed 命令的构建方式如下:

  1. "s/COLNAME" 设置开头
  2. ^" 将文字 " 字符附加到 sed 命令
  3. "|" - 添加 | 管道字符
  4. ^" - 添加另一个 "
  5. "/COLNAME/g" - 用替换和全局修饰符/标志结束 sed 命令。

【讨论】:

  • 我要替换的字符串是 COLNAME|双引号在我试图运行的命令中的管道周围,因为我读到特殊字符需要用双引号括起来
  • @BrianP_TRHC 那么,您想用COLNAME"|" 替换COLNAME| 吗?然后使用"C:\Program Files (x86)\GnuWin32\bin\sed.exe" "s/COLNAME|/COLNAME"^""|"^""/g" FILENAME
  • @BrianP_TRHC 查看更新后的答案,现在可以使用了吗?
  • 不,我要替换的文字字符串是 COLNAME|与 COLNAME
  • @BrianP_TRHC 所以,完全没有问题,"C:\Program Files (x86)\GnuWin32\bin\sed.exe" "s/COLNAME|/COLNAME/g" FILENAME 工作正常。
猜你喜欢
  • 2011-08-25
  • 2014-03-21
  • 1970-01-01
  • 2016-12-19
  • 2016-11-02
  • 2011-06-05
  • 2020-05-22
相关资源
最近更新 更多