Bash 如何使用cut命令从文件中提取包含分隔符的字段

Bash 如何使用cut命令从文件中提取包含分隔符的字段,bash,shell,unix,sh,cut,Bash,Shell,Unix,Sh,Cut,在Unix中,假设一个文件包含5个字段和数据,例如: "112233"|"Roshan"|"25"|" FAX 022 3987789 \| TEL 77766288892 \| abc "|"Male" 需要提取第四个字段。下面使用 column_value=`echo $line | cut -f4 -d'|' 这只给了我们-“传真0223987789\ 但需要“传真022 3987789\|电话77766288892\|abc”作为第四列值 有效分隔符应为- “|” 您可以添加两个额外

在Unix中,假设一个文件包含5个字段和数据,例如:

"112233"|"Roshan"|"25"|" FAX 022 3987789 \| TEL 77766288892 \| abc "|"Male"
需要提取第四个字段。下面使用

column_value=`echo $line | cut -f4 -d'|'
这只给了我们-
“传真0223987789\

但需要
“传真022 3987789\|电话77766288892\|abc”
作为第四列值

有效分隔符应为-

“|”


您可以添加两个额外字段,如下所示

echo $line | cut -f 4,5,6 -d\|
或者,您可以使用sed将“|”分隔符替换为不同的字符(例如制表符)


当涉及解析输入字符串/文件所需的多字符反限制器时,
cut
不是合适的工具

您可以使用它来定义记录中每个字段的外观。您可以将
FPAT
作为正则表达式常量写入,在这种情况下,下面的内容应该可以工作

FPAT = "(\"[^\"]+\")"
Awk
命令中使用此命令

line='"112233"|"Roshan"|"25"|" FAX 022 3987789 \| TEL 77766288892 \| abc "|"Male"'
awk '
BEGIN {
    FPAT = "(\"[^\"]+\")"
}{print $4}' <<<"$line"

cut
不是正确的工具。您需要一个CSV解析器,更准确地说,将值读入变量
$line
可能是错误的方法(如果确实这样做,请在任何地方使用
read-r
和引号
“$line”
)。另请参阅
line='"112233"|"Roshan"|"25"|" FAX 022 3987789 \| TEL 77766288892 \| abc "|"Male"'
awk '
BEGIN {
    FPAT = "(\"[^\"]+\")"
}{print $4}' <<<"$line"
" FAX 022 3987789 \| TEL 77766288892 \| abc "