Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何在unix中处理同一文件中的嵌套分隔符_Linux_Unix_Awk_Sed - Fatal编程技术网

Linux 如何在unix中处理同一文件中的嵌套分隔符

Linux 如何在unix中处理同一文件中的嵌套分隔符,linux,unix,awk,sed,Linux,Unix,Awk,Sed,我有一个分号分隔的文件 文件中的一个字段是管道分隔的 例如 field-1;field-2;value-1|value-2|value-3;field-4;field-5 这里的field-3只是管道分隔值 现在我的要求是,如果字段-3中有多个值 我只需要保留第一个值。丢弃该字段中第一个管道之后的任何内容 i、 例如,我只想在字段-3中保留第一个值,如下所示 field-1;field-2;value-1;field-4;field-5 您能告诉我如何使用sed/awk实现这一点吗 sed

我有一个分号分隔的文件

文件中的一个字段是管道分隔的

例如

field-1;field-2;value-1|value-2|value-3;field-4;field-5
这里的
field-3
只是管道分隔值

现在我的要求是,如果
字段-3
中有多个值

我只需要保留第一个值。丢弃该字段中第一个管道之后的任何内容

i、 例如,我只想在
字段-3
中保留第一个值,如下所示

field-1;field-2;value-1;field-4;field-5
您能告诉我如何使用sed/awk实现这一点吗

sed 's/[|][^;]*//g' YourFile
  • 它删除(不替换)一个
    |
    [|]
    模式)之后的任何值,直到它不是
    [^;]
    模式)和每次出现时(
    g
    选项)
  • 假设
    |
    只是一个分隔符,而不是字段值的一部分(如字符串)
单向:

$ x='field-1;field-2;value-1|value-2|value-3;field-4;field-5'
$ echo $x | awk -F";" '{gsub(/\|.*/,"",$3);}1' OFS=";"
field-1;field-2;value-1;field-4;field-5
$
这可能适用于您(GNU-sed):


这将匹配前三个字段,并将其替换为前两个字段和第三个字段中的第一个值。

也许您只需要一个具有regex搜索和替换功能的文本编辑器;只需搜索
|*
并将其替换为
。在这种情况下,您需要一个循环来处理每个字段。您还可以直接在$0上修改regex*文件*中的一个字段,这样不仅可以或特别是我想象的示例中的第三个字段
sed -r 's/^(([^;]*;){2}[^|;]*)[^;]*/\1/' file