bash,文本文件删除每行最后一个 space 之前的所有文本

bash, text file remove all text in each line before the last space

我有一个格式如下的文件:

First Last UID
First Middle Last UID

基本上,有些名字有中间名(有时不止一个中间名)。我只想要一个仅作为 UID 的文件。

是否有我可以 运行 删除最后一个 space 之前的所有内容的 sed 或 awk 命令?

awk

使用打印每行的最后一个字段。

最后一个字段使用 NF 变量进行索引,该变量包含每行的字段数。我们使用美元符号对其进行索引,生成的单行代码很容易。

awk '{ print $NF }' file

rs, cat & tail

另一种方法是转置文件的内容,然后抓取最后一行并再次转置(这很容易看到)。

生成的管道是:

cat file | rs -T | tail -n1 | rs -T

剪切和修改

使用rev我们也可以通过反转线来实现这个目标,切割第一场然后再次反转它。

rev file | cut -d ' ' -f1 | rev

sed

使用 we simply remove all chars until a space is found with the ^.* [^ ]*$。此正则表达式表示匹配行的开头 ^,后跟任何字符序列 .* 和 space </code>。剩下的就是一串非space的<code>[^ ]*,直到行尾$。 sed 一行是:

sed 's/^.* \([^ ]*\)$//' file

我们捕获最后一部分的地方(在 \(\) 之间)并将其分回到整行。 </code>表示抓到的第一组,也就是最后一个字段。</p> <h2>备注</h2> <ol> <li><p>正如 <a href="https://whosebug.com/users/1745001/ed-morton">Ed Norton</a> 巧妙地指出的那样,我们可以简单地不捕获该组并删除正则表达式的前一部分。这可以很容易地实现 </p> <p><code>sed 's/.* //' file

这明显更简单,更优雅。

  • 有关详细信息,请参阅 man sedman awk

  • 使用grep

    $ grep -o '[^[:blank:]]*$'  file
    UID
    UID
    

    -o 告诉 grep 只打印匹配的部分。正则表达式 [^[:blank:]]*$ 匹配行中的最后一个单词。