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
使用awk打印每行的最后一个字段。
最后一个字段使用 NF
变量进行索引,该变量包含每行的字段数。我们使用美元符号对其进行索引,生成的单行代码很容易。
awk '{ print $NF }' file
rs, cat & tail
另一种方法是转置文件的内容,然后抓取最后一行并再次转置(这很容易看到)。
生成的管道是:
cat file | rs -T | tail -n1 | rs -T
剪切和修改
使用cut和rev
我们也可以通过反转线来实现这个目标,切割第一场然后再次反转它。
rev file | cut -d ' ' -f1 | rev
sed
使用 sed we simply remove all chars until a space is found with the regex ^.* [^ ]*$
。此正则表达式表示匹配行的开头 ^
,后跟任何字符序列 .*
和 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 sed
和 man awk
。
使用grep
:
$ grep -o '[^[:blank:]]*$' file
UID
UID
-o
告诉 grep 只打印匹配的部分。正则表达式 [^[:blank:]]*$
匹配行中的最后一个单词。
我有一个格式如下的文件:
First Last UID
First Middle Last UID
基本上,有些名字有中间名(有时不止一个中间名)。我只想要一个仅作为 UID 的文件。
是否有我可以 运行 删除最后一个 space 之前的所有内容的 sed 或 awk 命令?
awk
使用awk打印每行的最后一个字段。
最后一个字段使用 NF
变量进行索引,该变量包含每行的字段数。我们使用美元符号对其进行索引,生成的单行代码很容易。
awk '{ print $NF }' file
rs, cat & tail
另一种方法是转置文件的内容,然后抓取最后一行并再次转置(这很容易看到)。
生成的管道是:
cat file | rs -T | tail -n1 | rs -T
剪切和修改
使用cut和rev
我们也可以通过反转线来实现这个目标,切割第一场然后再次反转它。
rev file | cut -d ' ' -f1 | rev
sed
使用 sed we simply remove all chars until a space is found with the regex ^.* [^ ]*$
。此正则表达式表示匹配行的开头 ^
,后跟任何字符序列 .*
和 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 sed
和 man awk
。
使用grep
:
$ grep -o '[^[:blank:]]*$' file
UID
UID
-o
告诉 grep 只打印匹配的部分。正则表达式 [^[:blank:]]*$
匹配行中的最后一个单词。