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
로 사용한 다음 테스트를 통과한 파일에서 실행하도록 하세요.grep
sed
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 구문을 사용하고 있으므로 괜찮다고 가정합니다.{} \;
sed
sed
sed
sed
sed
a
당신은 또한 볼 수 있습니다"find"의 -exec 옵션 이해