我想创建目录,并且在同一行中我想更改路径并将其保存在输出文件中,我不想重复代码,所以我尝试了:
cut -d ';' -f 1 tmp1 | tr '.' '/' | xargs -I % bash -c 'mkdir -p %; sed 's/$/\/version/'% > output'
我有一个错误:
sed: -e expression #1, char 6: unknown option to `s'
你知道我做错什么了吗?
答案1
生成错误的原因是您使用了许多'
。特别s/$/\/version/
是位于任何单引号之外。
sed
正在处理文件或正在处理标准输入。它无法更改作为参数传递的字符串。printf
内置命令可用于附加/version
。
评论:
- 从
tmp1
文件读取的每一行都会提取一个名称,因此名称不包含\n
。 cut
根据和的使用tr
,生成的目录名称中将不包含任何.
或;
字符。
您想要实现的目标是:
cut -d ';' -f 1 tmp1 | tr '.' '/' | xargs -I % bash -c 'mkdir -p "%" ; printf "%s/version/\n" "%"' > output
请注意,名称中的特殊字符将会破坏上述命令行:例如'
(单引号)。
cut
并且可以用一个可以安全地处理名称(用空字符分隔)来tr
替换。awk
xargs -0
尝试一下这个安全版本:
awk -F\; '{gsub(/[.]/,"/",$1);printf("%s\0",$1)}' tmp1 | xargs -0 bash -c 'for f; do mkdir -p "${f}";printf "%s/version\n" "${f}";done' arg0dummy > output
awk
脚本:
-F\;
定义;
为字段分隔符,因此$1
是第一个字段(在 之前;
)gsub
用于.
替换/
printf
用于打印结果并插入最后的\0
(空)字符。
xargs
:
-0
:输入项以空字符而不是空格结尾,引号和反斜杠不是特殊字符(每个字符都按字面意思理解)。禁用文件结尾字符串,该字符串将像其他任何参数一样处理。当输入项可能包含空格、引号或反斜杠时很有用。
bash -c ...
:
arg0dummy
:虽然未使用但它是强制性的;请参阅man bash
。