![awk 从变量中删除字符串](https://linux22.com/image/62333/awk%20%E4%BB%8E%E5%8F%98%E9%87%8F%E4%B8%AD%E5%88%A0%E9%99%A4%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
HP-UX *** B.11.31 U ia64 ***无限用户许可证
我想将当前目录中名为 abc.txt 的文件移动到名为 ./begperl 的目录。当我这样做时,我希望文件的移动版本被命名为 ab.txt。我想要的是从文件名中删除预定义的字符串并移动它,并根据第三个变量 = Y/ 删除原始文件N。我尝试过下面的oneliners但没有成功。
awk -v name=abc.txt -v dir=begperl 'BEGIN{ renamed_var=substr("c", "", name);system("mv " name "./"dir/renamed_var)}'
awk -v name=abc.txt -v dir=begperl 'BEGIN{ renamed_var=substr("c", "", name); print renamed_var}'
awk -v name=abc.txt -v dir=begperl 'BEGIN{ print substr("c", "", name) }'
awk -v name=abc.txt -v dir=begperl -v variable_two=substr("c", "", name){print variable_two}'
awk -v name=abc.txt -v dir=begperl -v variable_two=substr("c", "", name){print variable_two}'
我唯一能工作的班轮是
awk -v name=abc.txt -v dir=begperl 'BEGIN{ system("mv " name " ./"dir)}'
非常感谢
答案1
您需要sub
(子研究所)而不是substr
(子细绳) 命令:比较
$ awk -v name="abc.txt" 'BEGIN {substr("c","",name) ; print name}'
abc.txt
和
$ awk -v name="abc.txt" 'BEGIN {sub("c","",name) ; print name}'
ab.txt
然而,除非您将其作为学习的编程练习awk
,否则确实没有理由不使用 shell 来执行此类操作,例如bash
:
newname="${name%c.*}.${name##*.}"
形成一个字符串,name
以最短的尾随匹配开头c.
,并与通过删除最长匹配部分形成的点扩展连接起来.
答案2
你为什么用awk
这个?如果您同时拥有原始名称和目标名称,为什么不直接使用 呢mv abc.txt begperl/ab.txt
?
如果您没有目标名称并且只想从原始名称中删除一个字符,则可以在 shell 中执行此操作。再说一次,不需要awk
:
file="abc.txt"; mv "$file" begperl/"${file//c}"
这将删除所有出现的c
from $file
。要仅删除第一个,请使用
file="abc.txt"; mv "$file" begperl/"${file/c}"
或者,你可以这样做
mv abc.txt begperl/"$(echo "abc.txt" | sed 's/c//')"
答案3
我是OP。我认为这并不像我想象的那么容易在一个班轮中实现。我想我稍后会制作这个班轮(或者永远不会;-))
#!/usr/bin/ksh
ORIGINAL_FILE_NAME_WITH_PATH_VARIABLE=$1
REMOVE_STRING_VARIABLE=$2
DELETE_ORIGINAL_FILE_NAME_WITH_PATH_VARIABLE=$3
if [[ $# -ne 3 ]]
then
echo "Script requires three parameters. First:Filename with path. Second:String to remove from filename. Third:Y or N to delete file"
exit 1
fi
ORIGINAL_FILE_NAME_VARIABLE=`echo ${ORIGINAL_FILE_NAME_WITH_PATH_VARIABLE} | awk -F '/' '{print $NF}'`
#echo ${ORIGINAL_FILE_NAME_VARIABLE}
AMENDED_FILE_NAME_VARIABLE=`echo ${ORIGINAL_FILE_NAME_VARIABLE} | sed "s/${REMOVE_STRING_VARIABLE}//g"`
#echo ${AMENDED_FILE_NAME_VARIABLE}
ORIGINAL_FILE_LOCATION_DIR=`echo ${ORIGINAL_FILE_NAME_WITH_PATH_VARIABLE} | awk 'BEGIN{FS=OFS="/"}{$NF=""; NF--; print}'`
if [[ -f ${ORIGINAL_FILE_LOCATION_DIR}/${AMENDED_FILE_NAME_VARIABLE} ]]
then
AMENDED_FILE_NAME_VARIABLE=${AMENDED_FILE_NAME_VARIABLE}_$$_$$
fi
echo ${ORIGINAL_FILE_NAME_VARIABLE}|grep -q ${REMOVE_STRING_VARIABLE}
if [[ $? -ne 1 ]]
then
cp ${ORIGINAL_FILE_NAME_WITH_PATH_VARIABLE} ${ORIGINAL_FILE_LOCATION_DIR}/${AMENDED_FILE_NAME_VARIABLE}
if [[ ${DELETE_ORIGINAL_FILE_NAME_WITH_PATH_VARIABLE} = 'y' || ${DELETE_ORIGINAL_FILE_NAME_WITH_PATH_VARIABLE} = 'Y' ]]
then
rm ${ORIGINAL_FILE_NAME_WITH_PATH_VARIABLE}
fi
fi
但我真的认为这在单线中是可能的。我是OP。评论?