【问题标题】:delete text with delimiter in unix在unix中删除带分隔符的文本
【发布时间】:2021-08-21 07:36:18
【问题描述】:

我有一个格式如下的文本文件。我需要删除第一个和第二个分号(分隔符)之间的文本,但保留第二个分号

$cat test.txt
abc;def;ghi;jkl
mno;pqr;stu,xxx

我的预期输出

abc;ghi;jkl
mno;stu,xxx

我尝试使用sed 's/^([^;][^;]*);.*$/\1/',但它会删除第一个分号后的所有内容。我也试过cut -d ';' -f2,这只会将第二个字段作为输出。

【问题讨论】:

  • 错字错误。都是分号。
  • 请在您的问题中以代码的形式添加您的努力,这是非常鼓励的,谢谢。
  • @RavinderSingh13 我尝试使用 sed 's/^([^;][^;]*);.*$/\1/' ,但它删除了第一个分号后的所有内容。我也试过 cut -d ';' -f2 ,这只会将第二个字段作为输出。
  • 好的,请在您的问题中添加它们(cmets 不用于发布代码),谢谢。

标签: unix awk sed


【解决方案1】:

使用cut

cut -d";" -f2 --complement file
  • -d 用于分隔符,即“;”在你的情况下
  • -f 用于字段,即保留列出的字段
  • --complement 用于反转选择,即删除列出的字段

所以:

$ cat test.txt
abc;def;ghi;jkl
mno;pqr;stu;xxx

$ cut -d";" -f2 --complement test.txt
abc;ghi;jkl 
mno;stu;xxx

【讨论】:

  • 你应该提到它只适用于 GNU cut,而不是 POSIX cut
  • 如果--complement 选项看起来有点笨拙,请记住该选项可以缩短为第一个明确的可能性,即--comp 甚至--co
【解决方案2】:

你可以使用这个sed:

sed 's/;[^;]*//' file

abc;ghi;jkl
mno;stu,xxx

【讨论】:

  • 这是获得第二次出现:)的另一种创造性方式@
【解决方案3】:

您可以直接删除第二次出现的相关字符,例如

sed 's/[^;]*;//2' test.txt

使用/输出示例

$ sed 's/[^;]*;//2' test.txt
abc;ghi;jkl
mno;stu,xxx

也感谢 @EdMorton 在这里的改进。

如果您确实想使用awk,您也可以简单地将第二个字段替换为空,例如

awk -F';' '{sub(/;[^;]*/,"")}1' test.txt

(相同的输出)

感谢@EdMorton 对原版的改进。

或者正如 Cyrus 建议的 cut,删除字段 2,例如

cut -d';' -f-1,3- test.txt

(相同的输出)

【讨论】:

  • cut -d';' -f2- test.txt 没有像我们预期的那样工作。它删除第一列,而不是第二列。它本质上是说“从第 2 列开始保持”。
  • 我还有一个脑筋急转弯的awk 方案。循环遍历所有字段而不输出第二个字段怎么样?稍长一点,但可以避免所有潜在问题?
  • 那也不错。或者使用 GNU awk,您可以像使用 sed 一样使用 gensub()
【解决方案4】:

在这里尝试修复 OP 的尝试,使用 sed 您可以尝试以下代码。简单的解释是,创建第一个反向引用,其值直到第一次出现 ; 然后从第一个 ; 到第二个 ; 不要将其保留在反向引用中,并将其余值保留在第二个反向引用中。最后用第一个和第二个反向参考值替换它。

sed -E 's/^([^;]*);[^;]*;(.*)/\1;\2/' Input_file

或者根据 Ed 的评论,请尝试关注;

sed -E 's/^([^;]*);[^;]*/\1/' Input_file

【讨论】:

    【解决方案5】:

    超级懒的awk解决方案

    gawk/mawk/mawk2 'sub(/;[^;]+/,"")'
    

    一个更详细的解决方案,但更清楚它在做什么

    g/mawk 'BEGIN {FS=";+"; OFS=";"} ($2="")||($0=$0)&&($1=$1)'
    

    清除第二个字段,但由于分配了空字符串,它返回0(false),因此需要逻辑或||才能继续。

    $0=$0 加上$1=$1 清理多余的;,这也会打印出来。

    【讨论】:

      猜你喜欢
      • 2019-05-15
      • 1970-01-01
      • 1970-01-01
      • 2021-07-31
      • 2016-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多