如何从shell中的文本中提取字符串

时间:2016-11-22 04:36:09

标签: shell sh

我有一个文件名

"PHOTOS_TIMESTAMP_5373382"

我想从此文件名中提取"PHOTOS_5373382"并添加"ABC",即最终希望它看起来像

shell脚本中的

"abc_PHOTOS_5373382"

3 个答案:

答案 0 :(得分:4)

echo "PHOTOS_TIMESTAMP_5373382" | awk -F"_" '{print "ABC_"$1"_"$3}'

echo将为awk命令提供输入。

awk命令使用选项'_'对输入的字符-F进行数据标记化。

可以使用$n访问单个令牌(从1开始),其中n是令牌号。

答案 1 :(得分:1)

您需要在shell上直接使用以下命令序列,最好是bash shell(或)作为一个完整的脚本,它将单个参数转换为要转换的文件

#!/bin/bash

myFile="$1"                                            # Input argument (file-name with extension)
filename=$(basename "$myFile")                         # Getting the absolute file-path
extension="${filename##*.}"                            # Extracting the file-name part without extension
filename="${filename%.*}"                              # Extracting the extension part
IFS="_" read -r string1 string2 string3 <<<"$filename" # Extracting the sub-string needed from the original file-name with '_' de-limiter
mv -v "$myFile" ABC_"$string1"_"$string3"."$extension" # Renaming the actual file

运行脚本
$ ./script.sh PHOTOS_TIMESTAMP_5373382.jpg
`PHOTOS_TIMESTAMP_5373382.jpg' -> `ABC_PHOTOS_5373382.jpg'

答案 2 :(得分:0)

虽然我喜欢awk

Native shell解决方案

k="PHOTOS_TIMESTAMP_5373382"
IFS="_" read -a arr <<< "$k"
echo abc_${arr[0]}_${arr[2]}

Sed解决方案

echo "abc_$k" | sed -e 's/TIMESTAMP_//g'
abc_PHOTOS_5373382