awk変数から文字列を削除する

awk変数から文字列を削除する

HP-UX *** B.11.31 U ia64 ***無制限ユーザーライセンス

現在ディレクトリにあるabc.txtというファイルを./begperlというディレクトリに移動したいと思います。これを行うときは、ファイルのモバイルバージョン名をab.txtとして指定したいと思います。私が望むのは、ファイル名から事前定義された文字列を削除して移動し、3番目の変数= 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のことを行わない理由はありませんbash

newname="${name%c.*}.${name##*.}"

name最短の末尾の一致で始まりc.、最長の一致部分を削除して、形成された点拡張に関連付けられた文字列を形成します。.

答え2

なぜこれを使うのですかawk?元の名前と宛先の名前の両方があれば、それを使用するだけではありませんかmv abc.txt begperl/ab.txt

ターゲット名がなく、元の名前から1文字だけ削除したい場合は、シェルでこれを実行できます。繰り返しますが、以下を行う必要はありませんawk

file="abc.txt"; mv "$file" begperl/"${file//c}"

これにより、cからのすべての項目が削除されます$file。最初のアイテムのみを削除するには、次のようにします。

file="abc.txt"; mv "$file" begperl/"${file/c}"

または、次のことができます。

mv abc.txt begperl/"$(echo "abc.txt" | sed 's/c//')"

答え3

私はOPです。思ったより1つのライナーで実装するのは簡単ではないようです。私はこのライナーを後で作ると思います(それとも決して作らないでしょう;-))

#!/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です。コメント?

関連情報