在bash中使用IFS使用\ r \ n拆分字符串

时间:2017-10-04 02:43:35

标签: bash ifs

我想在bash中拆分字符串包含\ r \ n但是回车符和\ n给出了问题。任何人都可以给我提示不同的IFS吗?我也尝试过IFS ='|'。

输入:

projects.google.tests.inbox.document_01\r\nprojects.google.tests.inbox.document_02\r\nprojects.google.tests.inbox.global_02

代码:

IFS=$'\r'
inputData="projects.google.tests.inbox.document_01\r\nprojects.google.tests.inbox.document_02\r\nprojects.google.tests.inbox.global_02"
for line1 in ${inputData}; do
    line2=`echo "${line1}"`
    echo ${line2} //Expected one by one entry
done

预期:

projects.google.tests.inbox.document_01
projects.google.tests.inbox.document_02
projects.google.tests.inbox.global_02

2 个答案:

答案 0 :(得分:5)

inputData=$'projects.google.tests.inbox.document_01\r\nprojects.google.tests.inbox.document_02\r\nprojects.google.tests.inbox.global_02'
while IFS= read -r line; do
  line=${line%$'\r'}
  echo "$line"
done <<<"$inputData"

注意:

  • 字符串定义为string=$'foo\r\n',而不是string="foo\r\n"。后者不会在您的变量中放置实际的CRLF序列。有关此语法的说明,请参阅bash-hackers维基上的ANSI C-like strings
  • ${line%$'\r'}是一个parameter expansion,如果存在变量line,则会从变量for的内容末尾删除文字回车。
  • BashFAQ #1详细介绍了逐行读取输入流(此处使用)的做法。与使用argsort进行迭代不同,它不会尝试将数据扩展为globs。

答案 1 :(得分:1)

以下awk可以帮助您解决问题。

awk '{gsub(/\\r\\n/,RS)} 1'  Input_file

OR

echo "$var" | awk '{gsub(/\\r\\n/,RS)} 1'

输出如下。

projects.google.tests.inbox.document_01
projects.google.tests.inbox.document_02
projects.google.tests.inbox.global_02

说明: 使用awk&#39; gsub实用程序用于全局替换,它的方法是gsub(/regex_to_be_subsituted/,variable/new_value,current_line/variable),所以我在这里给\\r\\n(在这里指出我要逃避\\,这意味着它将把它作为一个字面字符)RS(记录当前行中的分隔符,其默认值为新行。然后1表示awk处理条件和操作的方法,因此,通过提及1我将条件设置为TRUE并且没有给出任何操作,因此将发生当前的默认操作打印。

编辑: 使用您可以使用的变量。

var="projects.google.tests.inbox.document_01\r\nprojects.google.tests.inbox.document_02\r\nprojects.google.tests.inbox.global_02"
echo "$var" | awk '{gsub(/\\r\\n/,RS)} 1'
projects.google.tests.inbox.document_01
projects.google.tests.inbox.document_02
projects.google.tests.inbox.global_02