질문 1

질문 1

script1.sh, script2.sh, ..., 10개의 bash 쉘 스크립트가 있다고 가정합니다 script10.sh. 처음에는 10개의 파일이 모두 동일합니다.

이제 각 스크립트에서 두 가지 사항을 변경하고 싶습니다.

  1. 각 파일에서 특정 줄(예: 8번 줄)을 변경하고 싶습니다. 즉, 8번 줄의 모든 항목을 삭제하고 다음으로 바꿉니다."마디 없는"문자열을 지정합니다. 예를 들어 "This is line 8." 다음과 같습니다.이 문제, 하지만 그들은 바꾸기를 사용하고 싶어하며 "AAA"나는 "BBB"8행(그것이 무엇이든)을 바꾸기로 바꾸고 싶습니다 "This is line 8.".

  2. 각 파일에서 다른 특정 줄(예: 21번 줄)을 변경하고 다음으로 바꾸고 싶습니다."바꾸다"내가 지정한 문자열입니다. 예를 들어, script1.sh21행을 로 변경하고 21행을 21행으로 변경하고 싶습니다 . "XYZ"본질적 으로 이것은 함수에 대한 여러 호출일 뿐입니다.script2.sh"PQR"script3.sh"ABC"(1)위와 같습니다. 단, 모든 파일이 아닌 별도의 파일에서 변경을 수행하고 단 하나가 아닌 10개의 다른 문자열을 지정한다는 점만 제외하면 됩니다. 그래서 얻기 위해(2)여기, 어쩌면 내가 전화할지도 몰라(1)10개의 다른 시간, 다른 매개변수.

bashvi, , 등과 같은 일반적인 Linux 프로그램을 사용하는 솔루션에 관심이 있습니다 awk.gawk

답변1

for file in f1 f2; do
  sed -i '8s/^.*$/foo/' "$file"
done

답변2

awk를 사용하세요

for file in script1.sh script2.sh script3.sh ... script10.sh; do
    temp=$(mktemp)
    awk '
        BEGIN {
            line8 = "This is line 8"
            line21["script1.sh"] = "XYZ"
            line21["script2.sh"] = "PQR"
            line21["script3.sh"] = "ABC"
            # ... 
        }
        FNR == 8 { print line8; next }
        FNR == 21 && FILENAME in line21 { print line21[FILENAME]; next }
        {print}
    '  "$file" > "$temp" && mv "$temp" "$file"
done

또는 bash 및 sed를 사용하십시오.

# bash variables to store new values. requires bash v4 for the associative array
line8="This is line 8"
declare -A line21=(
    [script1.sh]="XYZ"
    [script2.sh]="PQR"
    [script3.sh]="ABC"
    # ...
)
# then use sed
for file in script1.sh script2.sh script3.sh ... script10.sh; do
    sed -i "8s/.*/$line8/; 21s/.*/${line21[$file]}/" "$file"
done

sed 솔루션을 사용하면 새 줄에 "/" 문자가 포함되지 않도록 주의해야 합니다. 이렇게 하면 명령이 중단되기 때문입니다 s///. 다른 구분 기호를 사용할 수 있지만 s|pattern|replacement|(이 경우 동일한 경고가 반복적으로 적용됩니다)

ed또한 유효합니다:

for file in script1.sh script2.sh script3.sh ... script10.sh; do
    ed "$file" <<ED_COMMANDS
8d
8i
$line8
.
21d
21i
${line21[$file]}
.
w
q
ED_COMMANDS
done

답변3

두 가지 질문에 모두 답변해드리겠지만, 원칙적으로 이와 같은 질문을 병합하지 말고 별도의 게시물로 나누어 주시기 바랍니다.

질문 1

  1. 진주:

    for f in *.sh; do 
      perl -i -lne '$.==8 ? print "This is line 8" : print;' "$f"; 
    done
    
  2. awk 및 그 변형:

    for f in *.sh; do 
      awk '{if(NR==8){print "This is line 8"}else{print}}' "$f" > fifo && 
      mv fifo "$f";
    done
    

질문 2

먼저 만들고 싶은 대체 항목이 포함된 파일을 만듭니다. 예를 들어:

script1.sh  foo1
script2.sh  foo2
script3.sh  foo3
script4.sh  foo4

그런 다음 파일을 읽어 교체를 수행합니다.

while read f s; do 
 export s;
 perl -i -lne '$.==8 ? print "$ENV{s}" : print;' "$f";
done < sublist.txt

관련 정보