sed는 두 패턴(그 중 하나는 변수)에서 일치하는 항목을 검색하고 삭제합니다.

sed는 두 패턴(그 중 하나는 변수)에서 일치하는 항목을 검색하고 삭제합니다.

제거해야 할 여러 코드 인스턴스가 포함된 파일이 있습니다. 예는 다음과 같습니다.

!/bin/bash
mkdir /rootdir/pipeline_runs/oncology/analysis/sample_1_NA172_1
cd /rootdir/pipeline_runs/oncology/analysis/sample_1_NA172_1
ln -s ../oncology/importantFile1 importantFile1
ln -s ../oncology/importantFile2 importantFile2

mkdir /rootdir/pipeline_runs/oncology/analysis/sample_2_NA172_2
cd /rootdir/pipeline_runs/oncology/analysis/sample_2_NA172_2
ln -s ../oncology/importantFile1 importantFile1
ln -s ../oncology/importantFile2 importantFile2

mkdir /rootdir/pipeline_runs/oncology/analysis/sample_3_NA172_3
cd /rootdir/pipeline_runs/oncology/analysis/sample_3_NA172_3
ln -s ../oncology/importantFile1 importantFile1
ln -s ../oncology/importantFile2 importantFile2

실제로 이 스크립트에는 아마도 16~30개가 있을 것입니다. 이 파일에 sed를 입력하고 특정 샘플(예: 샘플_1_NA172_1)을 검색하고 mkdir 줄과 그 뒤의 13줄(이를 제외한 모든 샘플)을 삭제할 수 있어야 합니다. 어떤 경우에는 여러 예제에 대한 코드 조각을 유지해야 하지만 처음에는 하나의 작업만 수행하려고 합니다.

fileToEdit=above-mentioned-script.sh

# This pulls out the first line of each mkdir snippet along with the 
# sample name.
mkdirList=$(grep -E mkdir $fileToEdit)

# Removes the mkdir from output and cuts 
# all the dir path leaving just the sample name
sample=$(echo $mkdirList | sed 's/mkdir //g' | tr ' ' '\n' | cut -d/ -f14-)

printf "\n"
echo "Which sample(s) would you like to keep?"
printf "\n"

# Dynamic Menu Function
createmenu () {
select selected_option; do # in "$@" is the default
    if [ 1 -le "$REPLY" ] && [ "$REPLY" -le $(($#)) ]; then
        break;
    else
        echo "Please make a vaild selection (1-$#)."
    fi
done
}

declare -a tsample=();

# Load Menu by Line of Returned Command
mapfile -t tsample < <(echo $sample | tr ' ' '\n');

# Display Menu and Prompt for Input
echo "(Please select one):";
.
# This generates a dynamic numbered menu list of all the samples.
# Currently it allows the user to choose one sample to keep.
# Eventually I'd like to allow them to choose multiple samples. 
createmenu "${tsample[@]}"

# This is the sample that was chosen
tsample=($echo "${selected_option}");

# This greps all the samples BUT the chosen sample and makes it a variable.
rsample=$(echo $sample | tr ' ' '\n' | grep -v $tsample)

# This is my attempt to make an array out of the remaining samples
# that need to be deleted, and then sed search/delete them from the script.
declare -a array=( "echo $rsample" )
for i in "${!array[*]}"
    do
            sed -i '/mkdir.*$i/,+13 d' $fileToEdit
    done

다음을 성공적으로 사용할 수 있음을 확인했습니다.

sed -i /mkdir.*sample_1_NA172_1/,+13 d'

내 배열은 괜찮은 것 같아요. 내 문제는 sed 검색 필드 내부의 "*" 옆에 $i를 사용하는 것 같습니다.

그래서:

  1. 배열에 대해 와일드카드를 사용하여 sed를 작동시키려고 합니다.
  2. 여러 샘플을 저장할 수 있는 곳에 두고 싶습니다.

답변1

작은따옴표를 큰따옴표로 변경하면 작동합니까? :

sed -i "/mkdir.*$i/,+13 d" $fileToEdit

무엇에 대해:

 sed -i "/mkdir.*${i}/,+13 d" $fileToEdit

관련 정보