xargs 有两个命令 - mkdir 和 sed

xargs 有两个命令 - mkdir 和 sed

我想创建目录,并且在同一行中我想更改路径并将其保存在输出文件中,我不想重复代码,所以我尝试了:

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替换。awkxargs -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

相关内容