파일의 새 복사본을 원하므로 다음과 같은 작업을 수행하고 싶습니다.
dir *.rb
foreach file
make a copy of the file, e.g. 'blob.rb' to 'blob_processed.rb'
do the 50 sed commands to process the blob_processed.rb file
end
이 단계를 수행하는 30개의 파일을 만들지 않고 어떻게 이 작업을 수행할 수 있습니까(복사본 후 모든 sed). sed는 약간 길지만 작동하며 각 파일은 정확히 동일합니다. 한 가지 예:
sed -i "s#require "selenium-webdriver"#require 'my_helper' #" blob_processed.rb
답변1
*.rb
출력을 쓸 임시 디렉터리가 있는지 확인하세요. 그렇지 않으면 파일을 가져오지 않고blob_processed_processed.rb
명령을 두 번 실행할 수 없습니다 . 모든 것이 완료되고 제대로 작동하면 언제든지 임시 디렉터리에서 출력 파일을 복사할 수 있습니다.""
최소한 공백이 포함된 파일 이름을 처리할 수 있도록 파일 이름을 입력하십시오 .sed 명령에서
\"
큰따옴표를 이스케이프하려면 백슬래시( )를 사용하세요.
결과는 다음과 같습니다:
#!/bin/bash
mkdir -p tmp
for i in *.rb
do
out=tmp/${i%.rb}_processed.rb
cp "$i" "$out"
sed -i "s#require \"selenium-webdriver\"#require 'my_helper' #" "$out"
done
[Edited by Michael (OP)] 비록 제가 그랬지만 이것은 대부분 작동합니다:
#!/bin/bash
mkdir -p tmp
for i in *.rb
do
out=tmp/${i}
cp "$i" "$out"
done
동일한 파일 이름을 유지하되 모든 새 파일을 tmp/ 아래에 배치하세요.
답변2
다음과 같이 멋지게 할 수 있습니다.
for i in *.rb
do
cp -- "$i" "processed_$i"
sed -i 's#require "selenium-webdriver"#require '\''my_helper'\'' #' "processed_$i"
done
또한 이름이 변경된 원본 파일이 되어도 괜찮다면 파일을 수정하기 전에 seds 함수를 사용하여 파일을 백업할 수 있습니다.
sed --in-place=.orig 's#require "selenium-webdriver"#require '\''my_helper'\'' #' *.rb
답변3
sed 명령을 파일에 넣고 sed
. 어떤 이유로 -i
든 해당 옵션을 사용할 수 없지만 어쨌든 복사하고 있으므로 문제가 되지 않습니다. 예를 들어:
$ cat seds
s/require "selenium-webdriver"/require 'my_helper' /
s/foo/bar/
s/baz/bar/
s/hello/goodbye/
그 다음에,
for i in *.rb
do
sed -f seds "$i" > "processed_$i"
done