$ ls *
2000-01-01-abcd.md
2000-01-01-cdef.md
다음 명령에서 abcd 및 cdef를 추출할 수 있습니다.
find *.md -exec sh -c "echo {} | sed 's/.md//' | sed 's/2000-01-01-//'" \;
파일 시작 부분에 문자열을 추가하여 이를 수행하는 방법을 알고 있지만 sed '1s/^/string/'
정확한 문자열을 전달하는 방법은 무엇입니까?
각 파일의 시작 부분에 해당 문자열을 추가하고 싶기 때문에 이 문자열 "abcd" 및 "cdef"를 해당 파일에 어떻게 전달할 수 있습니까?
답변1
각 파일의 시작 부분에 해당 문자열을 추가하십시오.
세게 때리다+sed방법:
for f in *.md; do fn=${f##*-}; sed -i "1 s/^/${fn%.*} /" "$f"; done
fn=${f##*-}
- 가장 긴 일치 시퀀스를 왼쪽부터 마지막 항목까지 자릅니다-
(예abcd.md
: ).${fn%.*}
.
- 이전 하위 문자열fn
(예: )이abcd
처음으로 나타날 때까지 가장 오른쪽 시퀀스(끝부터 시작)를 자릅니다.sed -i "1 s/^/${fn%.*} /" "$f"
- 파일 시작 부분에 원하는 문자열을 추가합니다.
답변2
나는 이것이 내가 찾고 있던 것에 가장 가깝다는 것을 알았습니다. tmp 버퍼의 아이디어는 이러한 목적을 해결합니다. 다른 솔루션에서는 for 루프를 제안하고 있으며 제 생각에는 find -exec 조합이 이미 이 문제를 해결했습니다.
https://unix.stackexchange.com/a/197400/119007
find ./ -name '*.md' -exec sh -c "echo '{}' | sed 's/.md//' | sed 's/2000-01-01-//' > tmp && cat {} >> tmp && mv tmp {}" \;
답변3
*.md
명령에서 이를 인용 해야 합니다 find
. 그렇지 않으면 런타임 시 일치하는 이름으로 확장됩니다. 또한 {}
인용문의 맥락에서 사용해서는 안 됩니다 (예:"find -exec sh -c"를 사용해도 안전합니까?).
쉘 루프 솔루션은 다음과 같습니다.
for name in ./*.md; do
prefix="${name%.md}" # "./2000-01-01-abcd.md" --> "./2000-01-01-abcd"
prefix="${prefix##*-}" # "./2000-01-01-abcd" --> "abcd"
{ echo "$prefix"; cat "$name"; } >"$name".tmp && mv "$name".tmp "$name"
done
똑같은 것 find
:
find . -type f -maxdepth 1 -name "*.md" \
-exec sh -c 'p="${1%.md}";p="${p##*-}";{ echo "$p";cat "$1"; }>"$1".tmp && mv "$1".tmp "$1"' sh {} ';'