제목이 참 길군요. 본질적으로 내가 가지고 있는 것은 정규식을 사용하여 반복적으로 검색하고 바꿔야 하는 파일 모음입니다.
지금까지 내가 가지고 있는 것은 그룹을 캡처하지 않고도 작동하지만 그룹을 사용할 때는 아무 일도 하지 않습니다. 현재 내가 찾은 명령을 사용하고 있습니다.또 다른 문제:
grep -rlP "/\* *(\d+) *\*/ (.*)" . | xargs sed -i "s/\/\* *(\d+) *\*\/ (.*)/$2 \/\/ JD $1/g"
이 정규 표현식에는 이스케이프된 별표와 슬래시가 많이 포함되어 있어 매우 혼란스럽습니다. 그러나 기본적으로 문자열(예:)을 허용합니다.
/* 73 */ private static int last = -1000;
그리고 그것을로 교체
private static int last = -1000; // JD 73
그런데 앞서 말했듯이 전혀 작동하지 않고, 파일도 바뀌지 않습니다.
캡처 그룹을 사용하지 않는 대체 정규식과 잘 작동합니다.
grep -rl "/\* *\*/ " . | xargs sed -i "s/\/\* *\*\/ //g"
하지만 캡처 그룹을 도입하려고 하면 소리 없이 실패합니다.
드라이브가 성공한 것처럼 한동안 회전하는 소리가 들리기 때문에 파일을 검색하고 있다는 것을 알 수 있지만 결국 파일은 동일하게 유지됩니다.
명령이 작동하도록 수정하는 것이 가능합니까, 아니면 완전히 다르게 수행해야 합니까? 또한 이상적으로 이 솔루션에는 bash 루프가 필요하지 않습니다. 감사해요.
답변1
- 다른 Perl 호환 항목을 사용하지 않고 괄호가 필요하지 않으므로 in
-P
으로 바꾸고 or를 대신 사용하십시오.-E
grep
[[:digit:]]
[0-9]+
(\d+)
(.*)
그것에서 제거grep
하십시오. 중복됩니다.-E
캡처 그룹 에 추가하거나sed
이스케이프해야(...)
하며+
- sed가 이해하지 못하거나
\d+
대체 하거나[[:digit:]]
[0-9]+
- 역참조를 및
$1
로 대체\1
$2
\2
- 을 안전하게 제거할 수 있다고 생각합니다
g
. JD는 줄 시작 부분에 주석을 작성합니다.
grep -Erl '/\* *[[:digit:]]+ *\*/' . |
xargs sed -Ei 's/\/\* *([[:digit:]]+) *\*\/ (.*)/\2 \/\/ JD \1/'
답변2
에서는 sed
캡처된 그룹이 \1
등 \2
대신 등 으로 참조됩니다 $1
. $2
보다Back_002dreferences-and-Subexpressions.html
답변3
sed
이 예에서와 같이 를 사용하세요.
echo "/* 73 */ private static int last = -1000;" |
sed 's#^/\*[[:blank:]]*\([0-9]*\)[[:blank:]]*\*/[[:blank:]]*\(.*\)$#\2 // JD \1#g'
private static int last = -1000; // JD 73