파일에서 후행 공백을 제거하는 간단한 셸 스크립트가 있습니다. 임시 파일을 만들지 않고이 스크립트를 더 압축 할 수있는 방법이 있습니까?
sed 's/[ \t]*$//' $1 > $1__.tmp
cat $1__.tmp > $1
rm $1__.tmp
답변
Linux 및 Unix -i
의 경우 in place 옵션 을 사용할 수 있습니다 sed
.
sed -i 's/[ \t]*$//' "$1"
표현식은 t
OSX에서 후행을 삭제합니다 ( gsed
이 문제를 방지하기 위해 사용할 수 있음 ). BSD에서도 삭제할 수 있습니다.
gsed가없는 경우 OSX에서 올바른 (하지만 읽기 어려운) sed 구문이 있습니다.
sed -i '' -E 's/[ '$'\t'']+$//' "$1"
세 개의 작은 따옴표로 묶인 문자열은 궁극적으로 단일 인수 / 표현식으로 연결됩니다. bash에는 연결 연산자가 없으며 사이에 공백없이 문자열을 하나씩 배치합니다.
은 $'\t'
bash에서 리터럴 탭 문자로 해석되므로 ( ANSI-C 인용 사용 ) 탭이 표현식에 올바르게 연결됩니다.
답변
적어도 Mountain Lion에서 Viktor의 대답은 줄 끝에있을 때 문자 ‘t’도 제거합니다. 문제를 해결하는 다음 수정 사항 :
sed -i '' -e's/[[:space:]]*$//' "$1"
답변
-i
옵션 을 제안 해 주신 codaddict에게 감사드립니다 .
다음 명령은 Snow Leopard의 문제를 해결합니다.
sed -i '' -e's/[ \t]*$//' "$1"
답변
$ 1도 인용하는 것이 가장 좋습니다.
sed -i.bak 's/[[:blank:]]*$//' "$1"
답변
var1="\t\t Test String trimming "
echo $var1
Var2=$(echo "${var1}" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
echo $Var2
답변
OSX 및 Linux에서 작동하는 .bashrc에 스크립트가 있습니다 (bash 전용!)
function trim_trailing_space() {
if [[ $# -eq 0 ]]; then
echo "$FUNCNAME will trim (in place) trailing spaces in the given file (remove unwanted spaces at end of lines)"
echo "Usage :"
echo "$FUNCNAME file"
return
fi
local file=$1
unamestr=$(uname)
if [[ $unamestr == 'Darwin' ]]; then
#specific case for Mac OSX
sed -E -i '' 's/[[:space:]]*$//' $file
else
sed -i 's/[[:space:]]*$//' $file
fi
}
내가 추가하는 :
SRC_FILES_EXTENSIONS="js|ts|cpp|c|h|hpp|php|py|sh|cs|sql|json|ini|xml|conf"
function find_source_files() {
if [[ $# -eq 0 ]]; then
echo "$FUNCNAME will list sources files (having extensions $SRC_FILES_EXTENSIONS)"
echo "Usage :"
echo "$FUNCNAME folder"
return
fi
local folder=$1
unamestr=$(uname)
if [[ $unamestr == 'Darwin' ]]; then
#specific case for Mac OSX
find -E $folder -iregex '.*\.('$SRC_FILES_EXTENSIONS')'
else
#Rhahhh, lovely
local extensions_escaped=$(echo $SRC_FILES_EXTENSIONS | sed s/\|/\\\\\|/g)
#echo "extensions_escaped:$extensions_escaped"
find $folder -iregex '.*\.\('$extensions_escaped'\)$'
fi
}
function trim_trailing_space_all_source_files() {
for f in $(find_source_files .); do trim_trailing_space $f;done
}
답변
효율성 (처리 할 많은 파일 또는 대용량 파일)을 찾는 +
사용자의 경우 대신 반복 연산자를 *
사용하면 명령이 두 배 이상 빨라집니다.
GNU sed 사용 :
sed -Ei 's/[ \t]+$//' "$1"
sed -i 's/[ \t]\+$//' "$1" # The same without extended regex
또한 다른 것을 빠르게 벤치마킹했습니다. [ \t]
대신 사용 [[:space:]]
하면 프로세스 속도가 크게 향상됩니다 (GNU sed v4.4).
sed -Ei 's/[ \t]+$//' "$1"
real 0m0,335s
user 0m0,133s
sys 0m0,193s
sed -Ei 's/[[:space:]]+$//' "$1"
real 0m0,838s
user 0m0,630s
sys 0m0,207s
sed -Ei 's/[ \t]*$//' "$1"
real 0m0,882s
user 0m0,657s
sys 0m0,227s
sed -Ei 's/[[:space:]]*$//' "$1"
real 0m1,711s
user 0m1,423s
sys 0m0,283s