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
로 리디렉션합니다.sed
stdin
-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
현재 줄의 내용을 유지하고 선행 및 후행 공백 문자를 제거합니다.