从命令行中删除每一行的第一个和最后一个字符

pac*_*erg 10 sed awk text-processing

我试图删除文本文件中每一行的第一个和最后一个字符,并将生成的截断版本保存在一个新文件中。有没有人知道如何有效地使用awk或其他专门用于大文件的 linux 程序/命令?

输入文件

(s,2,4,5,6)
"s,1,5,5,2"
{z,0,4,5,3}
[y,2,4,5,5]
(y,4,4,5,7)
(r,20,4,5,7)
(e,9,4,5,2)
Run Code Online (Sandbox Code Playgroud)

预期输出.txt

s,2,4,5,6
s,1,5,5,2
z,0,4,5,3
y,2,4,5,5
y,4,4,5,79
r,20,4,5,7
e,9,4,5,2
Run Code Online (Sandbox Code Playgroud)

Dra*_*ris 15

另一种方式只是为了它:

rev input | cut -c2- | rev | cut -c2-
Run Code Online (Sandbox Code Playgroud)

(注意:对于 GNU cut,它仅适用于仅由一个字节组成的字符(如您的示例中所示))。

  • 猜猜这就是对许多这些 *nix 实用程序进行 40 多年优化将为您带来的好处! (4认同)

Rah*_*til 11

根据您的问题,从输入文件中删除最后一个和第一个单词,如下所示:

sed 's/.$//; s/^.//' inputfile
Run Code Online (Sandbox Code Playgroud)

  • @l0b0 我测试了`time yes | 头-n 10000000 | 命令>/dev/null`。我得到`rev输入| 切-c2- | 转 | cut -c2-` → 0.14s, `sed 's,.\(.*\).$,\1,'` → 3.38s; `awk '{print substr($0,2,length()-2);}'` → 3.50s; `sed 's/.$//; s/^.//'` → 5.09s。 (4认同)
  • @Gilles,那是很短的台词。我发现对于 30 个字符宽的行,@RahulPatil 的解决方案使用 GNU sed 的速度是@juampa 的 3 倍。还。`sed 's/.\(.*\)./\1/'` 似乎比 `sed 's/^.\(.*\).$/\1/'` (GNU sed 再次) 快. 此外,性能取决于语言环境(对字符的解释)和 `sed` 实现(在这方面,来自传家宝工具箱的 sed 比 GNU sed 快得多)。 (2认同)

小智 5

有很多可能性,一如既往

sed 's,.\(.*\).$,\1,g' your_file
Run Code Online (Sandbox Code Playgroud)

解释

  • , -- sed 分隔符,也可以是任何其他字符,只要它在任何需要的地方进行转义。
  • . 匹配单个字符
  • \(.*\) - 将剩余部分分组,并将其存储以供进一步检索。
  • . 再次匹配单个字符
  • $ - 行结束
  • \1 - 输出上面组匹配的文本
  • g 全局替换就行了。

  • 为什么是`g`?每行只有一场比赛。 (2认同)

小智 5

tr -d '()[]{}"' < your_file
Run Code Online (Sandbox Code Playgroud)

这应该也有效。它很好地将每个字符“翻译”为空(删除)。

缺点是,如果它们不是第一个/最后一个字符,它将删除它们。它还会错过您未在 中列出的任何结尾字符()[...