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
쉘을 사용하여 다음과 같은 작업을 수행하지 않을 이유가 없습니다 bash
.
newname="${name%c.*}.${name##*.}"
name
가장 짧은 후행 일치 항목으로 시작 c.
하고 가장 긴 일치 부분을 제거하여 형성된 점 확장과 연결되는 문자열을 형성합니다..
답변2
왜 이것을 사용합니까 awk
? 원래 이름과 대상 이름이 모두 있으면 그냥 사용하면 되지 않나요 mv abc.txt begperl/ab.txt
?
대상 이름이 없고 원래 이름에서 한 문자만 제거하려는 경우 셸에서 이 작업을 수행할 수 있습니다. 다시 말하지만, 다음을 수행할 필요가 없습니다 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입니다. 생각보다 하나의 라이너로 구현하기가 쉽지 않은 것 같습니다. 나는 이 라이너를 나중에 만들 것이라고 생각합니다(아니면 절대 만들지 않을 것입니다 ;-))
#!/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입니다. 논평?