행 번호가 포함된 열을 추출하는 탭 파일이 있는데 다른 파일에서 행을 추출해야 합니다. 나는 줄 번호를 얻어 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
이는 숫자 목록에서 스크립트를 생성하고 이를 표준 입력에서 읽고 파일에 적용하는 스크립트에 공급하는 데 사용됩니다 .sed
sed
-f /dev/stdin
목록이 비어 있으면 아무 작업도 수행하지 않고 종료되는 printf
표현식이 내보내집니다 .sed
sed
만약 너라면필요문자열의 숫자를 사용하려면 해당 문자열을 유효한 sed
스크립트로 변환하고 다음과 같이 파일에 적용할 수 있습니다.
sed 's/[[:digit:]]\{1,\}/&p;/g' <<<"$list" | sed -n -f /dev/stdin longText.txt
string 이 주어지면 위와 비슷한 방식으로 파일에 적용되는 스크립트가 2 5 7 10
생성됩니다 .sed
2p; 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