데이터 형식을 잃지 않고 sed 명령 출력을 변수에 전달하는 방법

데이터 형식을 잃지 않고 sed 명령 출력을 변수에 전달하는 방법

파이프로 구분된 데이터가 포함된 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 쉘에서 변수를 인용하는 것을 잊어버리는 보안 위험.

관련 정보