주어진 문자열을 포함하는 범위 내의 스크립트에서 줄을 제거하는 방법은 무엇입니까?

주어진 문자열을 포함하는 범위 내의 스크립트에서 줄을 제거하는 방법은 무엇입니까?

나는 제목이 자명하다고 생각합니다. 매개변수로 주어진 일부 파일이 있고 주어진 문자열은 내 스크립트의 마지막 매개변수입니다. 아래 두 스크립트를 모두 시도했지만 둘 다 작동하게 만드는 방법을 모르겠습니다. sed 명령에서 찾을 패턴(문자열)을 지정하는 두 스크립트 모두에서 일부 "\" 문자가 누락된 것 같습니다.

#!/bin/bash
a=${@: -1} # get last parameter into a variable
or ((i=1; i<$#; i++)) # for each parameter, except the last one
    do
        sed -i '1,30{/$a/d}' "${!i}" # delete each line in the i-th file, in range 1-30
                                      # containing $a (last given parameter)
    done

두 번째 시도:

#!/bin/bash
a=${@: -1} # get last parameter into a variable
for file in "${@:1:$# - 1}"
do
    sed -i '1,30{/$a/d}' $file
done

답변1

내 문제는 큰따옴표가 아니라 작은따옴표를 사용한다는 것입니다.변수 확장불가능한.

다음은 @guillermo chamorro가 요청한 입력 및 출력 파일과 터미널에서 스크립트를 호출하는 예와 함께 두 개의 작업 스크립트입니다(여기서 "call"이라는 단어를 올바르게 사용하고 있는지 확실하지 않습니다. "using"이라고 가정합니다). :

파일 1(파일 2같은 내용이 있습니다)

Out of the first 30 lines of this file I will be deleting only those that contain 
the character substring given as a parameter.
2
3
4
5
6
7
8
9
10
11
12    
13
14
15
16
17
18
19
30
31
32
33
...
and so on

function_shell_1

#!/bin/bash
a=${@: -1} # store last argument in a variable

    #part of the for-loop line is commented because of the first hashtag character

for ((i=1; i<$#; i++)) # consider all arguments, but the last one
do
    sed -i "1,30{/$a/d}" "${!i}" 
    # for each i-th line among the first 30 lines, do in-place deletions 
    #(-i dictates the in-place part) of each one containing the value of the
    # a variable
done

function_shell_2(for 루프에 대한 사소한 변경만)

#!/bin/bash
a=${@: -1} # store last argument in a variable

for fisier in "${@:1:$# - 1}" # consider all arguments, but the last one
do
    sed -i "1,30{/$a/d}" $fisier         
    # for each i-th line among the first 30 lines, do in-place deletions 
    #(-i dictates the in-place part) of each one containing the value of the
    # a variable
done

스크립트 명령 예:

./function_shell_1 file1 file2 '2'
#./function_shell_2 file1 file2 '2'

위의 두 가지 모두 정확히 동일하게 작동하며 두 가지 모두에서 동일한 예상 변경 사항을 생성합니다.파일 1그리고파일 2, 즉:

Out of the first 30 lines of this file I will be deleting only those that contain
the character substring given as a parameter.
3
4
5
6
7
8
9
10
11
13
14
15
16
17
18
19
31
32
33
...
and so on

관련 정보