명령의 각 출력 줄에 대한 접두사 및 접미사 문자열

명령의 각 출력 줄에 대한 접두사 및 접미사 문자열

Bash 스크립트를 작성하는 데 문제가 있습니다. 출력할 때 grep(보통) 많은 라인을 반환합니다. 각 출력 줄에 문자열 접두사와 접미사를 추가하고 싶습니다.

ls또한 나는 다음과 같은 파이프라인 에 있다는 점을 지적하고 싶습니다 grep.

ls | grep

답변1

sed를 사용하세요:

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

답변2

그리고 sed:

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

하지만 이렇게 하면 파일 이름에 줄바꿈이 포함된 문제와 모든 종류의 구문 분석 문제가 발생하므로 ls일반적으로 좋지 않은 생각입니다.

펄을 사용하여

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

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

예를 들어

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

grep기본 반복자는 $_현재 요소 값으로 설정되므로 sed/ grep스타일 정규식을 적용하거나 $_.

답변3

이 경우 GNU를 find사용하면 파이프와 잠재적으로 번거로운 구문 분석을 제거하여 모든 작업을 한 번에 수행할 수 있습니다 ls.

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

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

몇 가지 참고사항:

  • -maxdepth 1이름 일치 작업을 일반 (또는 ) -name [^.]*과 동일 하게 만듭니다 . 모든 쉘 스타일 glob을 사용할 수 있지만 "*"는 선행 "."과 일치합니다. 이름 †은 과 다르기 때문에 무엇이든을 의미합니다.lsls .bash[^.]*아니요선두 "."
  • MYPATTERN은 올바른 POSIX ERE입니다(기본 유형은 Emacs입니다. 참조).여기),하지만전체 파일 이름( ./접두사 포함) .*thing.*과 일치해야 하므로thing
  • 당신은 할 수아마도-name둘 다 대신 / 중 하나만 사용하세요 -regex(예: -regex "[^.].내 패턴."
  • -printf지원하다많은 것들%n는 수정되지 않은 파일 또는 디렉터리 이름입니다 .
  • 와는 find반대로 ls파일 이름 목록은 정렬되지 않습니다.
  • 파일 이름이 현재 로케일에서 유효한 텍스트로 구성되어 있다고 가정합니다.

(버전에 따라 다를 수 있습니다 find. 매뉴얼 페이지의 "표준 적합성" 섹션을 확인하세요.)

외부 프로그램이 필요하지 않은 가능한 대안으로 무엇보다도 옵션 없이 전역 변수를 확장합니다 bash.compgenls

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

개행을 포함하여 공백이 있는 파일 이름을 처리합니다. compgen -G "*"일반 출력과 동일한 출력을 제공해야 합니다 ls(그러나 이는 ls *완전히 다른 점에 유의하십시오). 여전히 필요합니다 grep. 이렇게 하면 문제가 해결될 수도 있고 해결되지 않을 수도 있지만 언급할 가치가 있습니다.

답변4

그리고awk

ls | grep | awk '$0="prefix"$0"suffix"'

"prefix""suffix"문자열 리터럴이므로 텍스트를 원하는 대로 바꾸세요.


원천:https://stackoverflow.com/a/2099492/2089675

관련 정보