【问题标题】:Newlines while saving variable to file - bash将变量保存到文件时换行 - bash
【发布时间】:2013-04-19 22:15:39
【问题描述】:

我在一个变量中有多个 IP 地址。

ActiveIPs=192.168.0.1 192.168.0.2 192.168.0.3

我想将它们保存到这样的文件中,用换行符分隔

192.168.0.1
192.168.0.2
192.168.0.3

我该怎么做?

【问题讨论】:

  • 一定有错字。该扩展的第一个字符不可能是空格,除非您将其括在引号中。
  • 你仍然需要引用整个字符串;否则,来自第二个标记的任何内容都被解释为 command(至少在 bash 3.2.48 中)。

标签: bash


【解决方案1】:
$ ActiveIPs="192.168.0.1 192.168.0.2 192.168.0.3"

$ awk '1' RS=' ' <<< "$ActiveIPs"
192.168.0.1
192.168.0.2
192.168.0.3

【讨论】:

  • 不错; RS(输入记录分隔符)技术很值得了解。一个警告:使用&lt;&lt;&lt;,您将在输出中得到一个额外的尾随\n;为避免这种情况,请使用printf "$ActiveIPs" | awk '1' RS=' '
【解决方案2】:

printf 将根据需要重复一个模式。

ActiveIPs="192.168.0.1 192.168.0.2 192.168.0.3"
printf "%s\n" $ActiveIPs > file.txt

【讨论】:

  • 我给所有不涉及管道或外部命令的答案+1。
  • 这对于特定输入值来说是一个很好的解决方案,但是对于一般用途来说它是棘手的:该解决方案依赖于由shell 扩展的值,这可以有不必要的副作用。
【解决方案3】:
for ip in $ActiveIPs; do
    echo $ip >> file
done

【讨论】:

  • (虽然将&gt; file 放在循环末尾写一次而不是单独附加每一行会更有效。)
【解决方案4】:

使用参数扩展将所有空格字符更改为换行符:

$ foo='abc def ghi'
$ echo "${foo// /$'\n'}"
abc
def
ghi

使用参数扩展完全避免了创建新进程,甚至不是内置命令。

如果可以,最好将值保存到数组中:

$ input=( 192.168.0.100 10.0.0.1 192.168.0.101 )

这样,您可以完全控制 shell 如何拆分单词,而您仍然不必调用外部命令。

$ SAVE_IFS="$IFS"
$ IFS=$'\n'
$ echo "${input[*]}"
192.168.0.100
10.0.0.1
192.168.0.101

【讨论】:

    【解决方案5】:

    也许太基础了,但这很有效:

    echo "ActiveIPs= 192.168.0.1 192.168.0.2 192.168.0.3" | cut -d= -f2 | awk '{for (i=1;i<=NF;i++) print $i}'
    

    输出:

    192.168.0.1                                                                                                                                                                                                                                                                    
    192.168.0.2                                                                                                                                                                                                                                                                    
    192.168.0.3
    

    致大家:有没有更好的方法在awk 的每个字段之间打印一个新行?尝试使用OFS='\n',但没有成功。

    【讨论】:

    • 回答你的问题echo "ActiveIPs= 192.168.0.1 192.168.0.2 192.168.0.3" | awk 'NR&gt;1' RS=' ' 但是我不认为ActiveIPs 包含在文本中,它是变量名,请参阅我的答案。
    • 哦,不知道RS。我认为它的目的是由OF 完成的(他们有什么区别?)。另外:现在我明白了你关于ActiveIPs=... 的观点,我认为这是一个完整的字符串。为您的回答 +1,@sudo_O。
    • 字段由记录组成,记录由字段组成,awk 迭代记录(默认情况下,记录是换行符)。通过定义记录是什么 awk 将进行迭代,因此您不必这样做。要了解为什么设置 OFS 不适用于您阅读 backreference.org/2010/02/10/idiomatic-awk 特别是自我分配部分。
    • 只需阅读您指定的网站的一点点,本周末阅读的内容看起来非常有趣。谢谢你,@sudo_O!将在星期一回来提出新问题:)
    【解决方案6】:

    注意 - 在\ 之后立即点击换行符-:

    echo $ActiveIPs | sed 's/ /\
    /g'
    

    【讨论】:

    • 这是一个使用$'\n'字面量的单行版本:echo $ActiveIPs | sed 's/ /\'$'\n''/g'
    猜你喜欢
    • 2020-05-03
    • 2012-02-27
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    相关资源
    最近更新 更多