sed가 교체하기 전에 확인을 요청하는 방법이 있습니까? vim 내부에서 replace를 사용할 때 'c'와 비슷한 것.
sed는 이것을 전혀하지 않습니까?
sed가 교체하기 전에 확인을 요청하는 방법이 있습니까? vim 내부에서 replace를 사용할 때 'c'와 비슷한 것.
sed는 이것을 전혀하지 않습니까?
답변:
그것을 이렇게하면 sed
은 대화 형이 아닌 스트림 편집자로 아마 불가능했을 것입니다. 포장 sed
스크립트에서하는 것은 너무 많은 생각을 필요로한다. 다음과 vim
같이 하는 것이 더 쉽습니다 .
vim -c '%s/PATTERN/REPLACEMENT/gc' -c 'wq' file.in
아래 주석에서 언급되었으므로 현재 디렉토리의 특정 파일 이름 globbing 패턴과 일치하는 여러 파일에서 사용되는 방법은 다음과 같습니다.
for fname in file*.txt; do
vim -c '%s/PATTERN/REPLACEMENT/gc' -c 'wq' "$fname"
done
또는 대체를 수행하기 전에 파일에 주어진 패턴과 일치하는 행이 실제로 있는지 확인하려는 경우,
for fname in file*.txt; do
grep -q 'PATTERN' "$fname" &&
vim -c '%s/PATTERN/REPLACEMENT/gc' -c 'wq' "$fname"
done
위의 두 셸 루프 find
는 top-dir
디렉토리 내 또는 디렉토리 아래에 특정 이름을 가진 모든 파일에 대해 동일한 작업을 수행하는 명령으로 수정되었습니다 .
find top-dir -type f -name 'file*.txt' \
-exec vim -c '%s/PATTERN/REPLACEMENT/gc' -c 'wq' {} \;
find top-dir -type f -name 'file*.txt' \
-exec grep -q 'PATTERN' {} \; \
-exec vim -c '%s/PATTERN/REPLACEMENT/gc' -c 'wq' {} \;
또는 원래 쉘 루프를 사용하고 find
피드 경로 이름을 지정하십시오.
find top-dir -type f -name 'file*.txt' -exec sh -c '
for pathname do
vim -c "%s/PATTERN/REPLACEMENT/gc" -c "wq" "$pathname"
done' sh {} +
find top-dir -type f -name 'file*.txt' -exec sh -c '
for pathname do
grep -q "PATTERN" "$pathname" &&
vim -c "%s/PATTERN/REPLACEMENT/gc" -c "wq" "$pathname"
done' sh {} +
어쨌든 당신은 그 이후로 무언가를하고 싶지 않습니다.for filename in $( grep -rl ... )
grep
도있다 루프의 첫 번째 반복, 시작하기 전에 실행 완료 우아를 하고,grep
은 공백에서 단어로 분리되며이 단어는 파일 이름을 붙입니다 (공백과 특수 문자가 포함 된 경로 이름을 제외합니다).관련 :
sed
예를 들어 여러 파일에서 작동 할 수 있다는 장점 이 있습니다 sed -i 's/old/new/g' /path/to/*.txt
.
for i in $(grep -rl "old"); do vim -c "%s/old/new/gc" -c "wq" "$i"; done
다음과 같이하면 얻을 수 있습니다.
:%s/OLD_TEXT/NEW_TEXT/gc
특히 c
세 번째 구분 기호 뒤에를 추가하십시오 .
'c'옵션은 Vim에서만 작동합니다. sed
명령 행에서 사용할 수 없습니다 .
sed
.
vim
답변이 적용됩니다. 그러나, vim과 sed는 다른 능력을 가지고 있습니다
당신은 할 수있는 sed
파일에 다음 다음 대화 형으로 사용하여 원본 파일에 패치 할 수 있습니다 임시 파일에 결과를 저장 그 일을 sdiff
참조 ( http://www.gnu.org/software/diffutils/manual/diffutils.html를 # Invoking-sdiff ) :
sed -r 's/something/something_else/g' my_file > tmp_file
sdiff -o my_file -s -d my_file tmp_file
searchandreplace () {
if [ -z $2 ] ; then
realpath * | xargs grep -ins --directories=skip --color=always "$1" | nl -s "."
else
realpath * | xargs grep -ins --directories=skip --color=always "$1" | nl -s "."
exp=$(realpath * | xargs grep -ins --directories=skip --color=never "$1" | cut -d':' -f1,2 | awk -F':' '{print $2 $1}' | sed -E "s|^[0-9]+|sed -i \'&s/|; s|//|/"$1"/"$2"/g\' /|")
IFS=$'\n'
for d in $exp
do
read -p "Exec $(echo -e -n "\033[1;31m$d\033[0m")? " -e REP
if [ "$REP" = y ]; then
echo `bash -c $d`;
fi
done
fi
}
이것을 단일 인수로 공급하면 – searchandreplace "AAA"
현재 디렉토리에서 해당 문자열 만 검색하지만 이중 인수로 공급하는 경우 – searchandreplace AAA BBB
위의 것 외에도 첫 번째를 두 번째 "행으로 대체하도록 요청합니다" 모든 줄에 대해