파일에서 명령 집합을 로드한 다음 파일 집합에서 각 명령 집합을 실행할 수 있는 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.sh
for 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 명령을 변경하고 싶을 수도 있지만 위의 명령은 원하는 대로 수행되는 것 같습니다.