如何删除仅在第一个分隔字段中包含/
or'
或-
or的行?.
|
- 尝试过的代码:
sed 's/^\.\d; /^\-/d; /^\//d' file > file_out
- 输入示例:
/|98374| /trust|q83129| //|392720| //cust|23892| .|9374| .abcd|28374| '|238674| 'hcsu|3810| -|327492| -abcde|9837|
- 预期输出:
.abcd|28374| /trust|q83129| //cust|23892| 'hcsu|3810| -abcde|9837|
答案1
基于“强制”awk
的解决方案:)
awk -F'|' '$1 !~ /^[\/'\''.-]+$/' input.txt
这会将字段分隔符设置为|
并且仅在满足条件时才打印“第一个字段 ( ) 与正则表达式 ( ) '仅包含, ,或' ( ,经过适当转义)$1
不匹配”!~
/
'
.
-
^[/'.-]+$
已实现。
请注意,表达这一点的语法有点复杂,因为程序awk
需要用单引号 ( ' ... '
) 括起来,否则 shell 会像$1
在到达 之前那样解释语句awk
。因此,字符列表包含单引号的“中断”(第一个'
),然后是转义文字单引号 ( \'
),然后是单引号程序的延续awk
。
或者,也许更容易阅读,将程序编写为一个带引号的字符串、一个带引号的字符串和另一个带引号的字符串的awk
串联:'...'
"..."
'...'
awk -F'|' '$1 !~ /^'"[\/'.-]"'+$/' input.txt
答案2
如果您的意思是删除第一个|
分隔字段完全由集合中的字符组成的行.-/'
,则:
grep -vxE "[./'-]+(\|.*)?"
(完全删除(带有-v
)行 ( ),该行由集合中 1 个或多个 ( ) 字符-x
的序列组成,后跟可选的 ( ),后跟任意数量 ( ) 的字符 ( ))。+
./'-
?
|
*
.
或者
grep -vE "^[./'-]+(\||\$)"
(删除^
以 ( ) 开头且集合中包含 1 个或多个 ( +
) 字符的行./'-
,后跟 ( |
)|
或行尾 ($
转义,因为它对于双引号内的 shell 来说仍然是特殊的,但通常不会在后跟)
))。
如果您还想删除第一个字段为空的行,请替换+
为。*
或者使用:
grep "^[^|]*[^|./'-]"
搜索除第一个字符^
之外至少包含一个 ()以外的字符的行。./'-
|
更一般地说,请注意sed /regexp/d
可以写成grep -v regexp
(和sed '/re1/d; /re2/d'
-> grep -v -e re1 -e re2
)。grep
除了更小并且通常更快之外,sed
还具有可移植地支持扩展正则表达式的优点,但并非所有sed
实现都支持-E
。支持正则表达式的grep
实现也多于支持正则表达式的实现。-P
perl
sed
答案3
你期望s/^\.\d
做什么?你打开了一个s
替代命令,但后来你只是被其他一些斜杠意外地关闭了它。您可能想/^\./d
删除带有点的行,但这也会删除该.abcd
行。
./'-
但您实际上似乎想要删除除之前没有其他字符的行|
。因此,将其放入正则表达式中:
sed "/^[./'-]*|/d" < file > file_out
这不会对打印行进行重新排序(如您所需的输出),但您没有指定如何对其进行重新排序。
并且您的示例没有显示如何处理空的第一个字段。如果应该打印此内容,请使用
sed "/^[./'-]\{1,\}|/d" < file > file_out
答案4
awk -F '|' "\$1 ~ /[^-./']|^$/" file