如何删除垂直条或管道 |内双竖条/管道|使用 sed?

Posted

技术标签:

【中文标题】如何删除垂直条或管道 |内双竖条/管道|使用 sed?【英文标题】:How to remove a vertical bar or pipe | inside double vertical bar/pipe | using sed? 【发布时间】:2021-10-15 14:31:38 【问题描述】:

我已经尝试了几个小时来对我正在从 CSV 转换为管道分隔的文件执行以下操作。转换后,我只想删除两个管道之间的管道。不知道有没有可能。

例子:

原始输入

X, Y, This is a | test for me, or 
X, Y, This is a|test for me,

原始输出:

| X | Y | This is a | test for me| or 
|X|Y|This is a|test for me|

期望的输出:

| X | Y | This is a test for me|

我尝试过,但我做不到,找不到 regexpr 或 sed - regexp 对我来说一直很难。

我是 C 语言的新手,脚本。我处理了转换,如果我们得到类似街道名称、apt 编号的东西,所以我们删除了 name 和 apt 之间的逗号,但保留了要转换为管道的数字之后的一个。

我做了一个cat 和几个sed 事件来处理其他事情,你认为最好在那里做吗?我有1k 多行吗?它使用 awk 作为我也不熟悉的部分脚本。

我的问题是最好的解决方案,还是应该在将其转换为管道之前处理它?我认为脚本的作用也是用双引号括起来,例如“街道名称,apt #”,这样它就可以删除引号内的逗号。

几次尝试都没有运气

cat <input> | sed 's/ | / /g' | tr , '|'

或:

cat <input> | sed 's/ | / /g;s/,/\|/g'

这是执行我上面描述的逗号的脚本,当它作为我的示例时,我需要添加管道处理程序,否则它将我的字符串分成两个

有人想帮忙吗?

【问题讨论】:

它与 C 有什么关系?不要垃圾标签 顺便说一句,你想避免useless use of cat 如果您在管道中的其他地方使用 Awk,您可能应该将所有内容重构到 Awk 脚本中。 awk 可以做sed 可以做的所有事情(还有catcuthead 等)。 @tripleee 该脚本是由一位高级开发人员传递的,我不知道如何执行 awk,它为逗号完成了所有工作,但我可以弄清楚,所以我可以复制管道,如果我这样做明白了,我不知道该怎么做 请don’t post images of code, error messages, or other textual data. 【参考方案1】:

应该这样做:

echo "X, Y, This is a | test for me" | sed  's/ |//;s/, /|/g'
X|Y|This is a test for me

【讨论】:

如果测试是“X, Y, This is a|test for me”,就像 a|test 之间没有空格一样。如果管道前后有空格,则它可以工作,但如果没有空格,则无效。你介意解释一下正则表达式吗?我也想知道完全理解它 @MrRobot 在空格后加问号使其可选sed 's/ ?|//;s/, /|/g' 那么请编辑您的问题以提供完整的要求,或者更好地接受此答案并根据您的实际要求提出一个新问题。另请参阅提供minimal reproducible example 的指南。 @Jotne 我很感激。它做我想要的,但我想它只是通过执行 sed 来完成 1k 记录,我想我现在需要弄清楚这一点。你认为你可以在你的回答中向我解释表达的每个部分,以便我能够理解它。我得到了一些不是全部的部分 当我这样做时,最后一个仍然失败sed 's/ ?|//;s/, /|/g' --- X, Y, This is a | test for me, or X, Y, This is a|test for me,【参考方案2】:

仅基于有限的输入数据集,一些假设:

忽略示例输入第一行的尾随 or,因为 or 未显示在预期输出中,否则 OP 需要提供有关何时删除尾随字符串的逻辑的详细信息 输入数据不包含任何逗号(,),即所有逗号都是分隔符 输出行有一个空格将每个字段与|分隔符分隔,这意味着最后一个字段应该在最后一个|之前有一个尾随空格,就像第一个/第二个字段显示一个尾随空格一样(在预期的输出) 所有输入/输出行都以分隔符结尾(,|) 所有输出行都以 | 分隔符开头 所有的空白都是实际的空格,即不需要处理制表符 注意:假设问题更新了更多细节,那么可以删除其中一些假设并相应更新建议的代码...

示例输入数据:

$ cat raw.csv
X, Y, This is a | test for me,
X, Y, This is a|test |  for me  |  ,

一个sed想法:

sed -E 's/[ ]*\|[ ]*/ /g; s/^[ ]*/\| /g; s/[ ]*,[ ]*$/ \|/g; s/[ ]*,[ ]*/ | /g' raw.csv

地点:

第一个 sub 用一个空格 替换 variable # of spaces + | + variable number of spaces [在添加 | 分隔符之前删除不需要的 |] 第二个 sub 将 start of line + variable number of spaces 替换为 | (单个尾随空格) 3rd sub 用空格 | 替换 variable number of spaces + , + variable number of spaces + end of line(单个前导空格) 4th sub 将variable number of spaces + , + variable number of spaces 替换为|(单个前导/尾随空格)

这会生成:

| X | Y | This is a test for me |
| X | Y | This is a test for me |

【讨论】:

好的,我有 50k 记录的 CSV 文件,它用双引号将实际逗号括起来,以避免被作为分隔符处理并删除它们。然后,作为分隔符的实际逗号将转换为|。问题是在某些字符串中我看到类似X, Y, this a|test for me, 的内容,所以当我转换为| 时,它会将test for me 部分作为新记录。我需要在我的文件中处理所有这些情况。所以就像有人提到的那样,首先从文件中删除所有|,然后将其转换为管道分隔符。 @MrRobot 我不确定我是否理解您的评论......建议的答案是否有效?如果“不是”,请用更多细节更新问题(以反驳我的假设)和/或提供更多此答案不起作用的示例输入

以上是关于如何删除垂直条或管道 |内双竖条/管道|使用 sed?的主要内容,如果未能解决你的问题,请参考以下文章

如何使垂直条颤动,如图所示

如何使我的垂直条尖端在 Flutter 中变圆

如何设置垂直条的样式,即“|”?

Eclipse:更改垂直条颜色

子光标宽度垂直条在 Safari 输入/文本区域中始终可见

Android - 将 ProgressBar 设置为垂直条而不是水平条?