如何删除垂直条或管道 |内双竖条/管道|使用 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 ofcat
如果您在管道中的其他地方使用 Awk,您可能应该将所有内容重构到 Awk 脚本中。 awk 可以做sed
可以做的所有事情(还有cat
、cut
、head
等)。
@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?的主要内容,如果未能解决你的问题,请参考以下文章