2016-10-18 4 views
0

sed 명령을 실행하는 데 문제가 있습니다. sed 명령이 실제로 ksh 스크립트에서 작동하는지 먼저 알고 싶습니다. ksh 스크립트를 실행하기위한 도구로 퍼티를 사용하고 있습니다.Sed 명령이 "Unrecognized Command"오류를 계속 발생합니다.

실제로 작동하는 경우, 내 사용 명령은 sed -e [^a-zA-Z0-9] <file>입니다.

grep에 대해 실제로이 명령을 실행합니다 (grep [^a-zA-Z0-9] <file>).

내 목표는 내 텍스트 파일의 모든 특수 문자를 가져 와서 변수 또는 다른 파일로 반환하는 것입니다. 나는이 사이트 및 다른 모든 사이트에 대해이 사이트를 찾고 있지만 실제로는 저에게 맞는 사이트를 찾지 못했습니다.

답변

0

너는 유효하지 않은 sed 스크립트입니다. 문제는 인용의 부족으로 악화됩니다.

따옴표없이 [^a-zA-Z0-9]은 일치하는 파일 이름 목록으로 확장됩니다. 현재 디렉토리에 ,? 등의 파일이있는 경우 grep이 실행되기 전에 glob가 grep , ? <file>으로 확장됩니다 (쉘 설정에 따라 다름 - shopt -s nullglob과 일치하는 항목이없는 경우 패턴이 사라짐).).

sed의 구문이 다릅니다. 정규식을 sed과 일치 시키려면

sed '/[^a-zA-Z0-9]/' <file> 

슬래시를 구성 할 수 있습니다. 당신이 슬래시를 포함하는 정규 표현식이있는 경우, 예를 들어, 당신은 백 슬래시를 앞에하여 다른 구분 기호를 사용할 수 있습니다

sed '\#[^a-zA-Z0-9/]#' <file> 

그냥 문자 어떤 경기, grep -o을 시도 추출 할 경우 - 그리고 다시, 당신의 변수를 적절히 인용하도록주의하십시오.

chars=$(grep -o '[^a-zA-Z0-9]' <file>) 
echo "$chars" # double quotes are *absolutely* *crucial* 

따옴표없이, 다시 쉘은 현재 디렉토리에있는 파일의 목록에 chars의 모든 *을 확장하려고 시도합니다.

+0

는 HTTP에서 더 자세히 설명 인용 : //stackoverflow.com/questions/10067266/when-to-wrap-quotes-around-a-variable – tripleee

0

sed은 사용자 쉘 외부의 바이너리 유틸리티입니다. 이

$ which sed 
/usr/bin/sed 

귀하의 명시된 목표는 특수 문자가 세트에없는 그 어떤이다 sed 및/또는 grep를 사용하여 텍스트 파일에서 "특별한"모든 문자를 얻는 것입니다 함께 어디 있는지 볼 수 있습니다 az, AZ 또는 0-9. sed를 사용하면 가장 쉬운 방법입니다 :

$ sed -e 's/[a-zA-Z0-9]//g' file 

빈 문자가 아닌 모든 특수 문자가 효과적으로 파일에서 제거을 대체합니다.입력으로 /etc/passwd 사용 예는 다음과 유사한 출력 뭔가됩니다

$ grep -o '[^a-zA-Z0-9]' /etc/passwd 

과 유사한 출력하지만, 각각의 일치를 생성합니다 :

$ sed -e 's/[a-zA-Z0-9]//g' /etc/passwd 
:::::/:// 
:::::/:// 
:::::/:// 
::::://:// 
:::::///:// 
:::::/:// 
:::::/:// 
:::::/:// 
:::::///:// 
:::::/:// 
::::://:// 
:::: ://:// 
:::::/:// 
:::::///:// 
-:::: :/:// 
-:::: :/:// 
-:::: :/:// 
--:::: :/:// 

grep 위해 당신은 일치하는 값 출력에 -o 옵션을 사용할 수 있습니다 문자가 새 줄에 나타납니다.

또 다른 옵션은 tr입니다 : 이전 sed 명령과 동일한 출력을 생성

$ tr -d '[:alnum:]' </etc/passwd 

. 이 같은 명령의 표준 출력 캡처 할 수있는 세 가지 경우 모두


: 또한 따옴표를 다시 사용

$ specials=$(tr -d '[:alnum:]' </etc/passwd) 
$ echo $specials 
:::::/:// :::::/:// :::::/:// ::::://:// :::::///:// :::::/:// :::::/:// :::::/:// :::::///:// :::::/:// ::::://:// :::: ://:// :::::/:// :::::///:// -:::: :/:// -:::: :/:// -:::: :/:// --:::: :/:// :::: :/:// :::: :/:// :::: :///:// :::: :///:// ::::://:// :::: ://:// :::::/:// :::: :///:// :::::///:// :::: /- :///-:// :::::///:// :::: :///:// :::: :/:// :::::///:// ::::://:// -:::: :/:// :::: :/:// :::: ://:// :::: :/:// :::: :///:// :::: :///:// --::::://--/:// -:::: :/:// ::::- :///:// :::: ://:// :::::/:// ::::://:// ::::://:// :::: ://:// :::: :///:// :::: :///:// :::: :///:// 

작동 :

$ specials=`tr -d '[:alnum:]' </etc/passwd` 
+0

'echo "$ specials와 같은 변수를 인용하지 않으면 my에서 설명한 바와 같이 놀라 울 정도의 디버깅 효과를 낼 수 있습니다. 이전 답변. – tripleee

+0

감사! :)이 하나는 내게 grep -o '[^ a-zA-Z0-9]'에 적용됩니다. – JMM

+0

@ JMM : 문제 없습니다. 3 가지 옵션 모두 작동합니다. 당신이 대답에 만족한다면 당신은 그것을 받아들이는 것을 고려할 수 있습니다. – mhawke

관련 문제