【问题标题】:cut command in bash terminating on quotation marksbash中的剪切命令以引号终止
【发布时间】:2013-02-03 05:26:06
【问题描述】:

所以我正在尝试读取一个文件,该文件包含一堆带有电子邮件地址和昵称的行。我正在尝试提取这个用括号括起来的昵称,如下所示

email@somewhere.com (Tom)

所以我的想法只是使用 cut 来获取单词 Tom,但是当我最终得到类似以下内容时,这被挫败了

email2@somewhereElse.com ("Bob")

因为 Bob 有引号,所以 cut 命令失败如下

cut: <file>: Illegal byte sequence

有人知道更好的方法吗?或者解决这个问题的方法?

【问题讨论】:

    标签: linux bash shell unix scripting


    【解决方案1】:

    将您的locale 重置为C(未解释的原始字节序列)以避免Illegal byte sequence 错误。

    locale charmap
    LC_ALL=C cut ... | LC_ALL=C sort ...
    

    【讨论】:

    • 这绝对有效。有没有办法在脚本中为所有命令重置一次,所以我不必每次都输入 LC_ALL=C 。如果不是那很好,但只是想知道。
    • 我确实注意到uniq 命令并不喜欢使用它,因为使用此标志时它似乎不起作用
    • 旁注,我得到了它的工作方式使用 iconv 如下iconv -c -f utf-8 -t ascii < names > temp 这有效,但由于某种原因,当我在此调用uniq 时,它会多次返回相同的名称.当然只是另一个障碍
    • “多次返回相同的名称”?我敢打赌,当您查看(使用od)时,您会发现存在差异...
    【解决方案2】:

    我认为

    grep -o '(.*)' emailFile 
    

    应该这样做。 “遍历文件中的所有行。查找以打开括号开头的序列,然后是任何字符,直到关闭括号。将与字符串匹配的位回显到标准输出。”

    这会保留昵称周围的引号......以及括号。如果你不想要这些,你可以去掉它们:

    grep -o '(.*)' emailFile | sed 's/[(")]//g'
    

    ("将方括号之间的任何字符替换为空,无处不在")

    【讨论】:

    • 这个行得通,我只是觉得 cut 不能处理这个有点烦人,但是 grep/egrep 可以。
    • 我知道grep/sed,我不知道cut。可能它可以完成这项工作 - 但我不能告诉你如何。希望你能接受这个答案...
    • 现在就可以了。我现在正在尝试使用 uniq 来计算存在多少个唯一名称,但这也让非法字符感到害怕。我想我最终会以某种方式将它们全部删除。目前正在调查中
    • 如果对输出进行排序,则可以检查“这一行是否与上一行相同”。很确定 awk 会让你这样做......
    • 排序也因为illegal byte sequence而失败
    【解决方案3】:
    perl -lne '$_=~/[^\(]*\(([^)]*)\)/g;print $1'
    

    测试here

    【讨论】:

      猜你喜欢
      • 2014-12-31
      • 2019-05-04
      • 2021-06-15
      • 2015-09-25
      • 2022-10-14
      • 2013-07-20
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      相关资源
      最近更新 更多