我想更改输出 xargs 显示的格式
cat k.txt
1
2
3
和
cat k.txt | xargs
1 2 3
不过我想要有1, 2, 3
或1|2|3
。有什么建议么?
答案1
下面是十多个示例,说明如何获取此类文件:
$ cat k.txt
1
2
3
并将其转换为以下格式:
1,2,3
如果您想一起玩,可以使用此命令创建上述文件:
$ cat <<EOF > k.txt
1
2
3
EOF
下面的示例分为 2 组。那些“有效”和“几乎”有效的。我留下这些是因为很多时候,了解为什么某些东西不起作用和了解为什么某些东西起作用同样有价值。
我熟悉的大多数脚本语言都有代表。有些被多次表示,因为与 Perl 中通常引用的著名缩写词一样,蒂姆托维迪。
笔记:您可以替换,
下面示例中的逗号 ( ) 并将其替换为您想要的任何字符,即|
。
“有效”的例子
这些代码片段将产生所需的输出。
命令paste
:
$ paste -s -d ',' k.txt
1,2,3
命令sed
:
$ sed ':a;N;$!ba;s/\n/,/g' k.txt
1,2,3
$ sed ':a;{N;s/\n/,/};ba' k.txt
1,2,3
命令perl
:
$ perl -00 -p -e 's/\n(?!$)/,/g' k.txt
1,2,3
$ perl -00 -p -e 'chomp;tr/\n/,/' k.txt
1,2,3
命令awk
:
$ awk '{printf"%s%s",c,$0;c=","}' k.txt
1,2,3
$ awk '{printf "%s,",$0}' k.txt | awk '{sub(/\,$/,"");print}'
1,2,3
$ awk -vORS=, 1 k.txt | awk '{sub(/\,$/,"");print}'
1,2,3
$ awk 'BEGIN {RS="dn"}{gsub("\n",",");print $0}' k.txt | awk '{sub(/\,$/,"");print}'
1,2,3
命令python
:
$ python -c "import sys; print sys.stdin.read().replace('\n', ',')[0:-1]" <k.txt
1,2,3
$ python -c "import sys; print sys.stdin.read().replace('\n', ',').rstrip(',')" <k.txt
1,2,3
Bash 的mapfile
内置:
$ mapfile -t a < k.txt; (IFS=','; echo "${a[*]}")
1,2,3
命令ruby
:
$ ruby -00 -pe 'gsub /\n/,",";chop' < k.txt
1,2,3
$ ruby -00 -pe '$_.chomp!"\n";$_.tr!"\n",","' k.txt
1,2,3
命令php
:
$ php -r 'echo strtr(chop(file_get_contents($argv[1])),"\n",",");' k.txt
1,2,3
注意事项
上面的大多数示例都可以正常工作。有些存在隐藏的问题,例如上面的 PHP 示例。该函数chop()
实际上是 的别名rtrim()
,因此最后一行的尾随空格也将被删除。
第一个 Ruby 示例和第一个 Python 示例也是如此。问题在于他们如何利用一种基本上盲目地“砍掉”尾随字符的操作。对于OP提供的示例来说,这很好,但是在使用这些类型的衬里时必须小心,以确保它们符合它们正在处理的数据。
例子
比如说我们的示例文件,k.txt
看起来像这样:
$ echo -en "1\n2\n3" > k.txt
它看起来很相似,但有一个细微的差别。它没有\n
像原始文件那样的尾随换行符 ( )。现在,当我们运行第一个 Python 示例时,我们得到以下内容:
$ python -c "import sys; print sys.stdin.read().replace('\n', ',')[0:-1]" <k.txt
1,2,
“几乎”有效的示例
这些是“永远是伴娘,不是新娘”例子。其中大多数可能都可以适应,但是当为问题寻找潜在的解决方案时,当感觉“被迫”时,它可能是不适合这项工作的工具!
命令perl
:
$ perl -p -e 's/\n/,/' k.txt
1,2,3,
命令tr
:
$ tr '\n' ',' < k.txt
1,2,3,
cat
+命令echo
:
$ echo $(cat k.txt)
1 2 3
命令ruby
:
$ ruby -pe '$_["\n"]=","' k.txt
1,2,3,
Bash 的while
+read
内置函数:
$ while read line; do echo -n "$line,"; done < k.txt
1,2,3,
答案2
@slm 已经给出了很好的答案,但正如你的问题“格式化 xargs 的输出”
xargs -I{} echo -n "{}|" < test.txt
-I
是“替换字符串”选项。{}
是输出文本的占位符。- 这类似于“查找”中使用大括号对。
如果您想摆脱尾随,|
您可以使用sed
以下方法进行一些清理:
$ xargs -I{} echo -n "{}|" < k.txt | sed -e 's/|$//'
1|2|3
答案3
我知道这是一个旧线程。 OP 用这样的简单代码询问。为了使其接近原始内容,我有一个简单的解决方案。
cat k.txt | xargs
1 2 3
使用sed
cat k.txt | xargs | sed 's/ /,/g'
1,2,3
或者
cat k.txt | xargs | sed 's/ /|/g'
1|2|3
sed 可能看起来有点奇怪,但分解后,它很有意义。
是替代品。 g' 代表全局:如果没有这个,它只会在每个新行上进行第一次替换。由于您使用“xargs”,它将它们显示为一行。所以你会得到“1,2 3”。
分隔符用于分隔。我使用了 / 字符。一个有趣的技巧:您可以将分隔符替换为大多数其他字符,只要我们在引号之间保持相同的格式即可。所以这也可以工作......
cat k.txt | xargs | sed 's# #,#g'
或者
cat k.txt | xargs | sed 'sT T,Tg'
显然,使用某些字符作为分隔符可能会造成混乱,所以要聪明。
答案4
xargs <k.txt | tr \ \|
您不需要cat
- 只需传入文件输入 - 如果没有给出其他命令 -xargs
将传递其默认格式 - 这是一种/bin/echo
's(没有反斜杠 c-转义解释)。
xargs
将从输入文件中去除头/尾空白并将其他空白序列压缩为单个空格。这意味着在将文件从 传递到tr
时xargs
:
tr \\n \| <k.txt | xargs
...印刷...
1|2|3|
...去另一种方法并仅在参数那个xargs
空格分隔确实......
1|2|3\n
...因为xargs
打印最后的尾随换行符(如文本文件所要求的),但它并没有tr
那样解释。
但请注意,这(或此处提供的任何其他解决方案)不考虑xargs
输入中的引用。xargs
将在输入中传递单/双/反斜杠引用的非换行空白字符,它们本身可以像这样引用:
xargs <<\IN
1 2' 3'\' \'4
IN
1 2 3' '4