[sed] sed로 후행 공백을 제거하는 방법은 무엇입니까?

파일에서 후행 공백을 제거하는 간단한 셸 스크립트가 있습니다. 임시 파일을 만들지 않고이 스크립트를 더 압축 할 수있는 방법이 있습니까?

sed 's/[ \t]*$//' $1 > $1__.tmp
cat $1__.tmp > $1
rm $1__.tmp



답변

Linux 및 Unix -i의 경우 in place 옵션 을 사용할 수 있습니다 sed.

sed -i 's/[ \t]*$//' "$1"

표현식은 tOSX에서 후행을 삭제합니다 ( 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