명령에서 각 출력 행에 접두사 및 접미사 문자열


17

Bash 스크립트를 작성하는 중에 문제가 발생했습니다. grep출력 할 때 (보통) 많은 줄을 반환합니다. 이 출력 라인 각각에 문자열을 접두사로 붙이고 싶습니다.

나는 또한 배관있어주의 하시겠습니까 ls으로 grep같은 :

ls | grep

2
파싱해서는 안됩니다 ls-나쁜 주주입니다. 또한 있어야 grep합니까? 그리고 예제 출력을 줄 수 있습니까?
Sobrique

1
파일 이름에 줄 바꿈이 포함되어 있으면 스크립트에서 무엇을 하시겠습니까?
Tai Viinikka

답변:


27

sed로 :

ls | grep txt | sed 's/.*/prefix&suffix/'

3
또는 sed의 상위 집합 인 grep: ls | sed -n '/txt/s/.*/prefix&suffix/p'ls | sed -n 's/.*txt.*/prefix&suffix/p'
스테판 Chazelas가

@ StéphaneChazelas :이 힌트에 감사드립니다.
사이러스

5

sed:

ls | grep pattern | sed -e 's/^/prefix/' -e 's/$/suffix/'

그러나 이것은 줄 바꿈으로 파일 이름에 문제가 있고 ls일반적으로 나쁜 생각 인 모든 구문 분석 문제가 있습니다.

펄로

perl -e 'print "prefix".$_."suffix\n" for grep { m/somepattern/} glob "*"'

참고-perl grepgrep명령 과 같은 패턴을 취할 수 있지만 파일 테스트 적용과 같은 작업을 수행 할 수도 있습니다.

예 :

grep {-d} glob "*" #filters directories.
grep { (stat)[9] > time() - 60 } glob "*" #reads file mtime and compares. 

grep기본 반복자 내 에서 $_현재 요소 값으로 설정되므로 정규식을 적용 sed/ grep스타일하거나에 따라 다양한 작업을 수행 할 수 있습니다 $_.


'sed'를 사용하여 첫 번째 예에서 변수를 접미사 / 접두사로 어떻게 포함합니까?
SpecialBomb

따옴표를 변경하고 em을 사용하십시오.
Sobrique

2

이 경우 GNU를 find사용하면 이러한 모든 작업을 한 번에 수행 할 수 있으므로 파이프를 제거하고 잠재적으로 문제를 해결할 수 있습니다.ls .

find . -maxdepth 1 -name '[^.]*' \
  -regextype posix-extended -regex "MYPATTERN" \
  -printf 'SOMEPREFIX %f SOMESUFFIX\n'

(find 물론 다른 명령의 출력을 임의로 수정하는 좋은 방법은 아닙니다!)

몇 가지 참고 사항 :

  • -maxdepth 1-name [^.]*일반 등의 메이크업 이름과 일치하는 작업과 동일한 ls(또는 ls .). 쉘 스타일 글로브를 사용할 수 있지만 "*"는 선행 "."과 일치합니다. 이름에 달리가 bash, 그래서 [^.]*아무것도 그 의미 "" 가없는 합니다.
  • MYPATTERN은 (기본 유형 이맥스입니다 참조 적절한 POSIX ERE는 여기 ), 하지만 그것은처럼 사용 무언가 때문에 전체 파일 이름과 일치해야합니다 .*thing.*대신 단지thing
  • 당신은 할 수 있습니다 아마 단지 중 하나를 사용 -name/ -regex[^.] "예를 들어 -regex (대신 모두의. MYPATTERN을. "
  • -printf지원의 많은 일들은 , %n아무 것도 추가되지 않은 파일이나 디렉토리 이름입니다

(사용중인 버전에 따라 다를 수 있습니다.find 있습니다. 맨 페이지의 "표준 준수"섹션을 확인하십시오.)

필요없이 외부 프로그램에 발생할 수있는 대안으로 bashcompgen에 globs와 동등한를 확장, 다른 것들 사이에있는, ls어떤 옵션 :

compgen -P "someprefix>" -S "<somesuffix" -G "pattern"

줄 바꿈을 포함하여 공백이있는 파일 이름을 처리합니다. compgen -G "*"일반과 동일한 출력을 제공해야합니다 ls(단, ls *완전히 다른 것임). 당신은 여전히 ​​필요 grep하며, 이것은 문제를 해결하거나하지 않을 수 있지만 언급 할 가치가 있습니다.


0

sed그리고 find희망이 환경 변수 (대신 즉시 값)을 통과, 경우 솔루션은 접두사 / 접미사 정규식 키 문자를 포함하면 도전되거나 xargs+ echo자세한 내용은 여기 적합 할 수 있습니다.

환경 변수 사용시 :

ls | grep p | xargs -I % sh -c "echo $PATH/%"

인라인으로 :

ls | grep p | xargs -I % sh -c "echo `pwd`/%"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.