ffmj0010.09o:FFMJ MARKER NAME
ffmj0020.09o:BRMU MARKER NAME
在这个文本文件中(2 行,行间无空格),我需要提取“:”后面的 4 个字符(“FFMJ”、“BRMU”)并将它们保存在另一个文本文件中。我需要使用哪个命令?
答案1
使用sed
:
sed 's/.*:\(.\{4\}\).*/\1/' in > out
s
:断言执行替换/
:停止命令/启动模式.*:
: 匹配任意数量的任意字符,直到最后一个:
字符和一个:
字符\(.\{4\}\)
:匹配并分组任意字符的 4 次出现.*
: 匹配任意数量的任意字符/
:停止模式/开始替换字符串\1
:反向引用被替换为第一个捕获组/
:停止替换字符串/启动模式标志
示例文件的示例输出:
% cat in
ffmj0010.09o:FFMJ MARKER NAME
ffmj0020.09o:BRMU MARKER NAME
% sed 's/.*:\(.\{4\}\).*/\1/' in > out
% cat out
FFMJ
BRMU
答案2
使用awk
和多个分隔符
awk -F'[: ]' '{print $2}' in > out
例子
$ cat in
ffmj0010.09o:FFMJ MARKER NAME
ffmj0020.09o:BRMU MARKER NAME
$ awk -F'[: ]' '{print $2}' in
FFMJ
BRMU
答案3
如果你确定你想要在行尾前恰好有 4 个字符,你可以执行以下操作:
grep -Eo '.{4}$' file.txt >out.txt
否则,您可以使用grep
PCRE 获取直到:
行尾的所有字符:
grep -Po '.*:\K[^:]+$' file.txt >out.txt
您还可以使用bash
参数扩展:
while IFS= read -r line; do echo "${line##*:}"; done <file.txt >out.txt
编辑:
正如 @kos 指出的那样,我可能误解了这个问题,如果您想要正好 4 个字符,:
您可以这样做:
grep -Po '.*:\K.{4}' file.txt >out.txt
答案4
使用grep
:
cat oldFile | grep -o ":[A-Z]*" | grep -o "[A-Z]*" > newFile
cat oldFile | # Read the file
grep
-o # Only give the greped data
":[A-Z]*" # Find a : followed by 4
# 4 capital letters
| grep -o "[A-Z]*" # Remove the : from that
然后> newFile
输出到文件。
举个例子:
ffmj0010.09o:FFMJ MARKER NAME
ffmj0020.09o:BRMU MARKER NAME
去
FFMJ
BRMU