한 줄씩 파일에서 bash 명령을 로드하고 디렉터리의 모든 파일에 대해 실행합니다.

한 줄씩 파일에서 bash 명령을 로드하고 디렉터리의 모든 파일에 대해 실행합니다.

파일에서 명령 집합을 로드한 다음 파일 집합에서 각 명령 집합을 실행할 수 있는 bash 대기열을 작성하려고 합니다. 준비된 파일은 수동 bash 대기열에서 실행하기 위한 템플릿 역할을 해야 합니다.

준비된 파일 sed.sh: ( 파일에도 댓글이 있는데 여기에 추가하는 방법을 모르겠어요)

sed -e 's,something_complex_long,something_even_longer,'
sed -e 's,other_complex_long_thing,something_so_much_longer,'
sed -e 's,another_long_stuff,something_hell_long,'

aa ab ac그리고 등과 같은 일반적인 이름을 가진 다소 큰 파일 세트가 포함된 디렉토리가 있습니다 (더 큰 파일로 자르려면 분할을 사용하십시오).

그래서 나는 다음을 시도한다:

sedie=\`grep -v -e '^#' ../../sed.sh\`
for i in *
do
  for b in $sedie
  do
    cat $i | $b > ${i}.new
    mv ${i}.new $i
  done
done

물론 이것은 두 번째 문장이 for공백으로 인해 문장을 깨뜨리기 때문에 완전히 실패합니다.$sedie

그런 다음 어딘가에서 찾은 것을 계속 사용하려고 했지만 IFS여전히 큰 진전이 없었습니다. 그런 다음 내가 원하는 것을 구별하는 데 도움이 되도록 명령을 일종의 배열에 로드해야 한다고 생각했습니다. 아마도 소스와 sed.sh같은 것일까 요 ?arr=("sed " "sed " "sed ")sed.shfor b in ${arr[*]}

이것을 우아한 방식(예: 재사용 가능)으로 수동으로 처리하는 방법을 아는 사람이 있습니까?

IFS시도는 상당히 번거롭고 어쨌든 작동하지 않았습니다 ... $b명령문, 공백 등으로 바뀌었고 그러한 명령이 없었습니다

SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
sedie=\`grep -v -e '^#' ../../sed.sh\`
for i in *
do
  for b in $sedie
  do
    echo cat $i \| $($b) \> ${i}.new
    echo mv ${i}.new $i
  done
done
IFS=$SAVEIFS

이것은 전혀 우아하지 않습니다.

업데이트 #1

다음 질문을 사용하세요.Bash 스크립트를 사용하여 파일 내용을 배열로 추출 이:변수에 저장된 명령을 실행하는 방법은 무엇입니까?, 이제 할 수 있어...

$ cat > myfile 
aaaaaaaa
aaaaaaa
aaaaaa
aaaa
aa
aaaa

$ cat sed.sh 
sed -e 's/a/b/g'
sed -e 's/b/c/g'
sed -e 's/c/f/g'

$ declare -a pole
$ readarray pole < sed.sh
$ for ((i=0;i<${#pole[@]};i++));do \
    eval ${pole[i]} xfile > xfile.b; mv xfile.b xfile; done; 

$ cat xfile
ffffffff
fffffff
ffffff
ffff
ff
ffff

그것이 내가 필요한 전부입니다. 그래서 내 질문은 기본적으로 두 가지입니다.

파일을 배열로 읽는 방법은 무엇입니까?

그리고

변수에서 명령을 실행하는 방법은 무엇입니까?

답변1

이것이 정확히 원하는 것이 아닐 수도 있지만 sed를 사용하고 있는 것으로 나타나므로 실행하려는 sed 명령만 포함하는 sed.cmd 파일을 만들 수 있습니다.

s,something_complex_long,something_even_longer,
s,other_complex_long_thing,something_so_much_longer,
s,another_long_stuff,something_hell_long,

테스트 sed.cmd에서 다음을 사용했습니다.

s/dog/cat

그런 다음 이 명령을 배열로 읽고 이 명령을 전달하는 sed를 호출하는 스크립트를 만듭니다.

array=()

# Read the file in parameter and fill the array named "array"
getArray() {
    i=0
    while read line # Read a line
    do
        array[i]=$line # Put it into the array
        i=$(($i + 1))
    done < $1
}

getArray "sed.cmd"

for cmd in "${array[@]}"
do
    ls -1 | while read line 
do 
    cat $line | sed -e $cmd > ${line}.new
    mv ${line}.new $line
done
done

파일을 정렬하기 위해 ls 명령을 변경하고 싶을 수도 있지만 위의 명령은 원하는 대로 수행되는 것 같습니다.

관련 정보