파일에 특정 문자열이 포함되어 있으면 특정 위치에 줄을 삽입하십시오.

파일에 특정 문자열이 포함되어 있으면 특정 위치에 줄을 삽입하십시오.

line 2파일 어딘가에 특정 문자열이 포함된 모든 파일에 문자열을 삽입하고 싶습니다 .

좋다 sed '1 a #This is just a commented line' -i

그러나 파일에 문자열이 포함된 경우에만 다음과 같습니다.
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-7">

답변1

당신의 명령을 가정하면,

sed -i '1 a #This is just a commented line'

해당 파일에 적용됩니다.

파일에 적용하려면 somefile파일에 문자열이 포함되어 있으면 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-7">다음을 사용할 수 있습니다.

if grep -q -F '<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-7">' somefile
then
    sed -i '1 a #This is just a commented line' somefile
fi

옵션을 사용 -q하면 grep유틸리티가 첫 번째 일치에서 중지되고 아무것도 출력되지 않습니다(종료 상태에만 관심이 있습니다). 이 옵션을 사용하면 주어진 패턴이 정규식 대신 문자열로 처리 -F됩니다 .grep

현재 디렉터리의 모든 파일에 적용하려면(비정규 파일 또는 일반 파일에 대한 심볼릭 링크 파일 건너뛰기):

pattern='<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-7">'

for name in ./*; do
    [ ! -f "$name" ] && continue
    if grep -q -F -e "$pattern" "$name"; then
        sed -i '1 a #This is just a commented line' "$name"
    fi
done

나는 여기서 -e "$pattern", 및 -e옵션을 사용하고 있습니다. 패턴이 변수에 보관되면 grep패턴을 지정하는 것이 좋습니다. -e변수 값이 대시로 시작하는 경우가 있을 수 있습니다(분명히 이 특정 질문에서는 그렇지 않음). 대시를 사용 grep하지 -e않으면 사람들이 패턴이 실제로 명령줄 옵션이라고 생각하도록 혼란을 줄 수 있습니다.

현재 디렉터리 안이나 아래의 모든 파일에 대해 이 작업을 수행하려면 다음을 수행하십시오.

pattern='<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-7">'

find . -type f -exec sh -c '
    pattern=$1; shift
    for name do
        if grep -q -F -e "$pattern" "$name"; then
            sed -i "1 a #This is just a commented line" "$name"
        fi
    done' sh "$pattern" {} +

그러면 sh -c발견된 파일 배치에 대해 짧은 인라인 스크립트가 실행되어 패턴을 첫 번째 명령줄 인수로 스크립트에 전달하고 발견된 경로 이름을 나머지 인수로 전달합니다.

또는 테스트 find로 사용한 다음 테스트를 통과한 파일에서 실행하도록 하세요.grepsed

pattern='<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-7">'

find . -type f \
    -exec grep -q -F -e "$pattern" {} \; \
    -exec sed -i '1 a #This is just a commented line' {} +

{} +위 명령의 끝에 대신을 사용하면 각 파일에 대해 한 번 수행하는 대신 한 번에 최대한 많은 입력 파일을 제공합니다. 이것이 제대로 작동하려면 GNU가 필요하지만 이미 명령에 GNU 구문을 사용하고 있으므로 괜찮다고 가정합니다.{} \;sedsedsedsedseda

당신은 또한 볼 수 있습니다"find"의 -exec 옵션 이해

관련 정보