파이프로 구분된 데이터가 포함된 5줄의 파일이 있습니다. sed 명령을 사용하여 각 줄 끝의 파이프만 제거합니다. 그러나 아래 명령 출력을 변수에 전달하면 데이터 형식이 손실되고 한 줄에 나타납니다.
5개 행을 그대로 유지하기 위해 다음 데이터를 변수에 전달하는 방법은 무엇입니까?
sed 's/.$//' $input|sort
답변1
귀하가 현재 수행 중인 작업을 우리에게 보여주지 않았기 때문에 100% 확신할 수는 없지만 변수를 인용하지 않은 것 같습니다. 예를 들어, 다음 파일이 제공됩니다.
$ cat file
foo|bar|baz|
foo|bar|baz|
foo|bar|baz|
foo|bar|baz|
foo|bar|baz|
foo|bar|baz|
foo|bar|baz|
명령을 실행하고 출력을 변수에 저장하면 줄 바꿈이 저장됩니다. 그러나 인쇄 여부는 변수를 인쇄하는 방법에 따라 다릅니다.
$ var=$(sed 's/.$//' file | sort)
$ echo $var ## bad
foo|bar|baz foo|bar|baz foo|bar|baz foo|bar|baz foo|bar|baz foo|bar|baz foo|bar|baz
$ echo "$var" ## good
foo|bar|baz
foo|bar|baz
foo|bar|baz
foo|bar|baz
foo|bar|baz
foo|bar|baz
foo|bar|baz
따옴표 없이 변수를 사용하면 $IFS
변수의 문자를 기준으로 변수를 분할하는 Split+Glob 연산자가 호출됩니다. 기본적으로 공백, 줄 바꿈 및 탭이 있습니다.
$ printf '%s' "$IFS" | od -c
0000000 \t \n
0000003
변수를 인용하면 분할+글로브(split+glob)로부터 변수를 보호할 수 있습니다. 이는 변수를 인용해야 하는 이유 중 하나입니다.항상 변수를 인용하세요.. 이유에 대한 자세한 내용은 다음을 참조하세요.bash/POSIX 쉘에서 변수를 인용하는 것을 잊어버리는 보안 위험.