如何删除sh中包含双引号的所有行?

时间:2011-09-18 18:10:43

标签: macos sed terminal sh

我试过了sed -ne '/\"/!p' theinput > theproduct
但这让我无处可去。它没有做任何事情。我该怎么办?

4 个答案:

答案 0 :(得分:3)

您无需逃避报价。写:

sed '/"/d' theinput > theproduct

sed -i '/"/d' theinput

直接改变文件。

如果你有@Jonathan Leffler建议的其他报价,你必须找出哪些。然后,使用\ x,您可以实现您想要的。 \ x用于指定十六进制值。

sed -i '/\x22/d' theinput

上面的行将删除包含普通(ASCII 34)引号的输入中的所有行。你必须尝试Jonathan建议的代码点。

答案 1 :(得分:1)

试试这个:

grep -v '"' theinput > theproduct

答案 2 :(得分:1)

你向我们展示的命令应该有效。

$ cat theinput 
foo"bar
foo.bar
$ sed -ne '/\"/!p' theinput > theproduct
$ cat theproduct 
foo.bar
$ 

除非您使用csh或tcsh作为交互式shell。在这种情况下,您需要转义!字符,即使在引号内也是如此:

% cat theinput 
foo"bar
foo.bar
% sed -ne '/\"/!p' theinput > theproduct
sed -ne '/"/pwd' theinput > theproduct
sed: -e expression #1, char 5: extra characters after command
% rm theproduct 
% sed -ne '/\"/\!p' theinput > theproduct
% cat theproduct 
foo.bar
% 

但这与你的陈述“它没有做任何事情”不一致,所以不清楚究竟发生了什么(并且问题标记为无论如何)。

但是有更简单的方法可以完成相同的任务,尤其是@Mike Sokolov建议的grep命令。

答案 3 :(得分:1)

您确定要输入'ASCII'吗?你有Unicode(UTF-8)的字符不是ASCII 34,还是Unicode U + 0022,还有别的吗?

替代Unicode'双引号'可以是:

  • U + 2033 DOUBLE PRIME; U + 201C LEFT DOUBLE QUOTATION MARK;
  • U + 201D RIGHT DOUBLE QUOTATION MARK;
  • U + 201F双倍高反转-9报价标记;
  • U + 02DD DOUBLE ACUTE ACCENT;
  • (很容易就会有其他人遗漏了)。

您可以使用od命令来调试它:

$ cat theinput
No double quote here
Double quote " here
Unicode pseudo-double-quotes include “”‟″˝.
$ od -c theinput
0000000    N   o       d   o   u   b   l   e       q   u   o   t   e    
0000020    h   e   r   e  \n   D   o   u   b   l   e       q   u   o   t
0000040    e       "       h   e   r   e  \n   U   n   i   c   o   d   e
0000060        p   s   e   u   d   o   -   d   o   u   b   l   e   -   q
0000100    u   o   t   e   s       i   n   c   l   u   d   e       “  **
0000120   **   ”  **  **   ‟  **  **   ″  **  **   ˝  **   .  \n        
0000136
$ od -x theinput
0000000      6f4e    6420    756f    6c62    2065    7571    746f    2065
0000020      6568    6572    440a    756f    6c62    2065    7571    746f
0000040      2065    2022    6568    6572    550a    696e    6f63    6564
0000060      7020    6573    6475    2d6f    6f64    6275    656c    712d
0000100      6f75    6574    2073    6e69    6c63    6475    2065    80e2
0000120      e29c    9d80    80e2    e29f    b380    9dcb    0a2e        
0000136
$ odx theinput
0x0000: 4E 6F 20 64 6F 75 62 6C 65 20 71 75 6F 74 65 20   No double quote 
0x0010: 68 65 72 65 0A 44 6F 75 62 6C 65 20 71 75 6F 74   here.Double quot
0x0020: 65 20 22 20 68 65 72 65 0A 55 6E 69 63 6F 64 65   e " here.Unicode
0x0030: 20 70 73 65 75 64 6F 2D 64 6F 75 62 6C 65 2D 71    pseudo-double-q
0x0040: 75 6F 74 65 73 20 69 6E 63 6C 75 64 65 20 E2 80   uotes include ..
0x0050: 9C E2 80 9D E2 80 9F E2 80 B3 CB 9D 2E 0A         ..............
0x005E:
$ sed '/"/d' theinput > theproduct
$ cat theproduct
No double quote here
Unicode pseudo-double-quotes include “”‟″˝.
$ 

odx是我自己的以十六进制转储数据的命令。)