Unix bash/ksh: 파일의 특정 줄에서 공백이 아닌 첫 번째 문자를 선택합니다.

Unix bash/ksh: 파일의 특정 줄에서 공백이 아닌 첫 번째 문자를 선택합니다.

file1.txt다음 내용이 포함된 파일이 있습니다 .

Date List
-----------
    Quarter Date
         Year Date
             Month Date

이제 파일의 각 줄에서 공백이 아닌 요소를 읽고 변수에 쓰고 싶습니다. 예를 들어, 2행의 경우 Quarter Year공백을 제거한 후에만 변수를 포함해야 합니다 .

나는 시도했다:

tail -1 file1.txt > variable1

그러나 이것은 작동하지 않습니다.

답변1

사용 sed:

variable1="$(< inputfile sed -n '3s/ *//p')"
  • variable1="$([...])": 서브셸에서 명령을 실행 [...]하고 해당 출력을 변수에 할당합니다.$variable
  • < inputfile: 콘텐츠를 's' inputfile로 리디렉션합니다.sedstdin
  • -n: 출력 억제

sed명령 분해:

  • 3: 입력의 세 번째 줄에서만 다음 명령을 실행하도록 어설션합니다.
  • s: 교체를 수행하도록 어설션
  • /: 검색 모드 시작
  • *: 0개 이상의 문자와 일치합니다.
  • /: 패턴 검색 중지/문자열 교체 시작
  • /:문자열 교체 중지(실제로 아무것도 교체되지 않음)/수정자 시작
  • p: 교체가 성공한 라인만 인쇄

답변2

먼저 필요한 줄을 변수로 읽어옵니다(예제에서는 3번 줄).

var=$(sed -n '3p' file1.txt)

sed 명령은 p파일의 세 번째 줄을 인쇄합니다( ). 스트립 선행 공백 사용매개변수 대체:

echo "${var#"${var%%[![:space:]]*}"}"

내부 교체는 선행 공백을 제외한 모든 것을 제거하는 것을 의미합니다. 외부 대체는 줄 시작 부분의 공백을 제거합니다.

출력은 다음과 같습니다

Quarter Date

답변3

tail -1 file1.txt > variable1파일에 쓰기 variable1.

대신 명령 대체(bash.info 3.5.4, POSIX sh)를 사용하십시오.

variable1="$(tail -1 file1.txt)"

그건 그렇고, cygwin의 내 GNU tail 버전에는 이 옵션이 없습니다 -1. 대신 다음을 사용합니다 sed.

# EREGEX: Replace all whitespace at beginning of line
# NOTE: BSD sed uses a different flag to enable EREGEX, -E.
# EDIT: Dropped -r. \s is already included in BRE.
#       Thanks to kos for pointing that out.
# EDIT: Use POSIX [:space:] instead of Perl \s.
variable1="$(sed -e 's/^[[:space:]]*//g' < file1.txt)"

라인 선택과 결합:

# EDIT: limit the [s]ubstitude operation to the 4th line only, and
#       [p]rint directly from s.
variable1="$(sed -ne '4s/^[[:space:]]*//p' < file1.txt)"

답변4

그리고 ksh/ zsh/ bash:

IFS=' ' read -r variable < <(tail -n 1 file)

read선행 및 후행 공백 문자 제거공백이 발견된 경우 IFS(기본적으로 탭 및 줄 바꿈과 함께)

다음과 같이 할 수도 있습니다.

while IFS=' ' read -r variable <&3; do
  something with "$variable"
done 3< file

파일을 한 줄씩 처리합니다(이것은 일반적으로 쉘을 사용하는 방법은 아니지만) $variable현재 줄의 내용을 유지하고 선행 및 후행 공백 문자를 제거합니다.

관련 정보