2

我需要在带有 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 命令一段时间,但似乎无法获得正确的语法。

关于如何做到这一点的任何建议?

4

1 回答 1

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 中使用 GNUCOLNAME"|"替换为,您可以使用COLNAMEsed

"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

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

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

  1. "s/COLNAME"设定开始
  2. ^"将文字"字符附加到 sed 命令
  3. "|"- 添加|管道字符
  4. ^"- 添加另一个"
  5. "/COLNAME/g"- 用替换和全局修饰符/标志结束 sed 命令。
于 2021-01-12T19:45:31.520 回答