Bash 提取包含多个节的部分文件名

Bash 提取包含多个节的部分文件名,bash,shell,Bash,Shell,我试图提取文件名的一部分,以便与其他文件名进行比较,因为它是唯一不变的部分。下面是模式和示例 clearinghouse.doctype.payer.transID.processID.date.time EMDEON.270.60054.12345678901213456789.70949996.20120925.01406403 所有部分在任何时候都是相同的长度,但clearinghouse&doctype除外,它的字符长度可能不同 我需要比较的文件名部分是transID 在shell脚本中

我试图提取文件名的一部分,以便与其他文件名进行比较,因为它是唯一不变的部分。下面是模式和示例

clearinghouse.doctype.payer.transID.processID.date.time EMDEON.270.60054.12345678901213456789.70949996.20120925.01406403

所有部分在任何时候都是相同的长度,但clearinghouse&doctype除外,它的字符长度可能不同

我需要比较的文件名部分是transID

在shell脚本中,最干净的最短方法是什么


多亏了有很多方法可以做到这一点,最简单的简单任务工具是cut命令。告诉cut要用作删除器的字符以及要打印的字段。这是执行您所需操作的命令

file=EMDEON.270.60054.1234567890123456789.70949996.20120925.014606403
transitId=$(echo $file | cut -d. -f4)
Awk也可以做同样的事情,并且允许你做更复杂的逻辑

file=EMDEON.270.60054.1234567890123456789.70949996.20120925.014606403
transitId=$(echo $file | awk -F. '{print $4}')

可以通过参数展开执行此操作:

$ foo=EMDEON.270.60054.1234567890123456789.70949996.20120925.014606403
$ bar=${foo%.[0-9]*.[0-9]*.[0-9]*}
$ echo "${bar##*.}"
1234567890123456789

您可以使用
read
命令使用适当的值将文件名拆分 对于
IFS

filename="EMDEON.270.60054.1234567890123456789.70949996.20120925.014606403"
IFS="." read clHouse doctype payer transID procID dt tm <<< "$filename"
echo $transID
filename=“EMDEON.270.60054.12345678900123456789.70949996.20120925.01406403”
IFS=“”读取clHouse doctype payer transID procID dt tm
# You only need one variable after transID to swallow the rest of the input without
# splitting it up.
IFS="." read _ _ _ transID _  <<< "$filename"
IFS="." read -a parts <<< "$filename"
transID="${parts[3]}"
tranid==`echo file_name|perl -F -ane 'print $F[3]'`