grep 파일의 시작? 있고 다른 문자는

리눅스 셸에서 특정 파일 세트가 모두 시작으로 <?끝나고 정확한 문자열이 있고 다른 문자는 시작하지 않도록하고 싶습니다 . “파일 시작”을 표현하기 위해 어떻게 grep하거나 다른 것을 사용할 수 있습니까?


편집 : 나는 이것을 와일드 카드 head로 만들고 같은 줄에 파일 이름을 지정하지 않으므로 grep 할 때 파일 이름이 표시되지 않습니다. 또한 "^<?"올바른 결과를 제공하지 않는 것 같습니다. 기본적으로 나는 이것을 얻고있다 :

$> head -1 * | grep "^<?"
<?
<?
<?
<?
<?
...

모든 파일이 실제로 좋습니다.



답변

배쉬에서 :

for file in *; do [[ "$(head -1 "$file")" =~ ^\<\? ]] || echo "$file"; done

파일인지 확인하십시오.

for file in *; do [ -f "$file" ] || continue; [[ "$(head -1 "$file")" =~ ^\<\? ]] || echo "$file"; done


답변

grep:

$ head -n 1 * | grep -B1 "^<?"
==> foo <==
<?
--
==> bar <==
<?
--
==> baz <==
<?

파일 이름을 구문 분석하십시오.

$ head -n 1 * | grep -B1 "^<?" | sed -n 's/^==> \(.*\) <==$/\1/p'
foo
bar
baz

답변

이것을 위해 awk를 사용할 수 있습니다 :

$ cat test1
<?xxx>
111
222
333
$ cat test2
qqq
aaa
zzz
$ awk '/^<\?/{print "Starting with \"<?\":\t" ARGV[ARGIND]; nextfile} {print "Not starting with \"<?\":\t" ARGV[ARGIND]; nextfile}' *
Starting with "<?":     test1
Not starting with "<?": test2
$

답변

빈 파일을 제외하고이 Perl 스크립트는 작동하는 것 같습니다.

perl -e 'while (<>) { print "$ARGV\n" unless m/^<\?/; close ARGV; }' *

빈 파일을 처리하는 방법을 즉시 잘 모르겠습니다. 나는 그것들을 별도의 특별한 경우로 취급하고 싶습니다.

find . -type f -size +0 -print0 |
    xargs -0 perl -e 'while (<>) { print "$ARGV\n" unless m/^<\?/; close ARGV; }'

답변

이 시도

for i in `find * | grep "php$"`; do echo -n $i " -> "; head -1 $i; done

PHP로 끝나는 모든 파일의 목록을 얻은 다음 루프를 통해 루프합니다. 파일 이름을 반영한 다음 파일의 첫 번째 줄을 인쇄합니다. 방금 삽입

다음과 같은 출력을 제공합니다.

calendar.php  -> <?php
error.php  -> <?php
events.php  -> <?php
gallery.php  ->
index.php  -> <?php
splash.php  -> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
information.php  -> <?php
location.php  -> <?php
menu.php  -> <?php
res.php  -> <?php
blah.php  -> <?php

그런 다음 끝에 일반 grep을 붙여보고 싶은 것을 제거하고 예외를 찾을 수 있습니다.

for i in `find * | grep "php$"`; do echo -n $i " -> "; head -1 $i; done | grep -v "<?php"

산출:

gallery.php  ->
splash.php  -> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

답변

배쉬 4.0

#!/bin/bash
shopt -s globstar
for php file in /path/**/*.php
do
   exec 4<"$php";read line <&4;exec 4<&-
   case "$line" in
     "<?"*) echo "found: $php"
   esac

done

답변

cat file.txt | head -1 | grep "^<?"

당신이 원하는 것을해야합니다.