쉘 변수에 저장된 줄 번호를 사용하여 줄을 인쇄하려면 sed를 사용하십시오.

쉘 변수에 저장된 줄 번호를 사용하여 줄을 인쇄하려면 sed를 사용하십시오.

행 번호가 포함된 열을 추출하는 탭 파일이 있는데 다른 파일에서 행을 추출해야 합니다. 나는 줄 번호를 얻어 cut -f변수에 저장했습니다 list. 나는 sed다음을 사용해 보았습니다.

$ list="2 5 7 10"
$ echo $list
2 5 7 10
$ sed -n "$list p" longText.txt 
sed: -e expression #1, char 3: unknown command: `5'
$ sed -n "${list}p" longText.txt 
sed: -e expression #1, char 3: unknown command: `5'

오류가 무엇인가요? 올바른 구문은 무엇입니까?

답변1

sed코드의 문제는 다음 과 같은 것을 실행하려고 한다는 것입니다.

2 5 7 10p

이것은 분명히 말이 되지 않으므로 sed불평합니다.

문제의 일부는 단일 문자열을 사용하여 다양한 항목(줄 번호)을 보유하는 것입니다. 이를 수행하려면 배열을 사용하는 것이 가장 좋습니다. 그런 다음 각 배열 요소(줄 번호)를 p그 뒤에 삽입하여 별도의 명령으로 만들어야 합니다 sed.

숫자 2, 5, 7, 10의 경우 sed다음과 같은 스크립트가 필요합니다.

2p; 5p; 7p; 10p;

또는

2p;5p;7p;10p;

또는

2p
5p
7p
10p

다음 배열에서 이러한 스크립트를 쉽게 만들 수 있습니다 bash.

lines=( 2 5 7 10 )
printf '%sp\n' "${lines[@]:-"q;"}" | sed -n -f /dev/stdin longText.txt

printf이는 숫자 목록에서 스크립트를 생성하고 이를 표준 입력에서 읽고 파일에 적용하는 스크립트에 공급하는 데 사용됩니다 .sedsed-f /dev/stdin

목록이 비어 있으면 아무 작업도 수행하지 않고 종료되는 printf표현식이 내보내집니다 .sedsed


만약 너라면필요문자열의 숫자를 사용하려면 해당 문자열을 유효한 sed스크립트로 변환하고 다음과 같이 파일에 적용할 수 있습니다.

sed 's/[[:digit:]]\{1,\}/&p;/g' <<<"$list" | sed -n -f /dev/stdin longText.txt

string 이 주어지면 위와 비슷한 방식으로 파일에 적용되는 스크립트가 2 5 7 10생성됩니다 .sed2p; 5p; 7p; 10p;

목록이 비어 있으면 sed아무 것도 출력되지 않습니다.

답변2

명령 앞에 에코를 추가하면 sed무엇이 잘못되었고 왜 발생했는지 확인할 수 있습니다.

편집기를 사용하는 한 가지 방법 sed은 다음과 같습니다.

# assuming default IFS
## based on Kusalananda's observations
set -f ;# disable globbing
list="2 5 7 10"
for i in $list;do
  echo "${i}p"
done | sed -nf - longText.txt

## or per Kusalanda method has a bug in it
## for empty list it generates wrong output
# printf '%sp\n' $list | sed -nf - lonxt.txt

관련 정보