【问题标题】:How to delete all text on a line appearing after a particular symbol?如何删除出现在特定符号之后的行上的所有文本?
【发布时间】:2012-04-29 17:14:09
【问题描述】:

我有一个文件,file1.txt,如下所示:

This is some text.
This is some more text. ② This is a note.
This is yet some more text.

我需要删除出现在“②”之后的所有文本,包括“②”和紧接在其前面的任何单个空格(如果存在这样的空格)。例如,上面的文件会变成file2.txt:

This is some text.
This is some more text.
This is yet some more text.

如何删除“②”、后面的任何内容以及前面的任何单个空格?

【问题讨论】:

  • 什么操作系统?你的文本是什么编码的?

标签: ruby perl bash sed python-2.7


【解决方案1】:

sed -e "s/[[:space:]]②[^\.]*\.//"

但是,我不确定②符号是否被正确解析。也许您必须使用 UTF8 代码或类似的代码。

【讨论】:

  • 它似乎没有删除任何文本,即使我尝试使用更简单的符号,例如字母。
  • 它对我有用。您使用哪个平台?也许您的 sed 需要特定语法的选项。
  • 我有GNU sed version 4.2.1
  • 尝试添加-r(在某些平台:-E)来切换扩展的正则表达式语法。
  • 根据文档,-r 应该打开正则表达式,但它仍然不起作用。
【解决方案2】:

我希望您确实意识到大多数 unix 实用程序不适用于 unicode。我假设您的输入是 UTF-8,如果不是,您必须相应地进行调整。

#!/bin/bash
function px {
 local a="$@"
 local i=0
 while [ $i -lt ${#a}  ]
  do
   printf \\x${a:$i:2}
   i=$(($i+2))
  done
}
(iconv -f UTF8 -t UTF16 | od -x |  cut -b 9- | xargs -n 1) |
if read utf16header
then
 echo -e $utf16header
 out=''
 while read line
  do
   if [ "$line" == "000a" ]
    then
     out="$out $line"
     echo -e $out
     out=''
   else
    out="$out $line"
   fi
  done
 if [ "$out" != '' ] ; then
   echo -e $out
 fi
fi |
 (perl -pe 's/( 0020)* 2461 .*$/ 000a/;s/ *//g') |
 while read line
  do
    px $line
  done | (iconv -f UTF16 -t UTF8 )

【讨论】:

    【解决方案3】:

    Perl 解决方案:

    $ perl -CS -i~ -p -E's/ ②.*//' file1.txt
    

    您最终会在 file1.txt 中获得正确的数据,并在 file1.txt 中备份原始文件~。

    【讨论】:

      【解决方案4】:

      试试这个:

      sed -e '/②/ s/[ ]*②.*$//'
      
      • /②/ 只查找包含魔法符号的行;
      • [ ]* 用于魔术符号前的任意数量(不匹配)空格;
      • .*$ 其他所有内容,直到行尾。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-10
        • 1970-01-01
        • 2015-02-16
        • 1970-01-01
        • 1970-01-01
        • 2019-10-05
        • 2010-10-28
        相关资源
        最近更新 更多